I wasn't aware GitHub had a wiki. Now that I think about it, it was kind of obvious. I've browsed GitHub wikis before. Shows how much I pay attention.
EDIT: GitHub limits download bandwidth, so it's not a good site for hosting binaries. There's the possibility of also using Google Code or other alternatives as a supplement to GitHub. Nothing's written in stone.
You could use Dropbox's public folder to host binaries & a web page (using a free domain name like .co.cc to mask the true URL). That way, you won't really have to worry about FTP accounts, web admin scripts & other crap like that.
_______________________
Technology: the one thing that's hated & cursed at by all engineers, technologists, scientists & technicians!
Well, I'm about half a month late. Perhaps I should be going by Valve time, with the number 3 and all... (hopefully their Linux client comes out this year - I'm stoked!)
New to this preview is the actual ability to edit and save songs. The workflow is essentially the same as the Windows version, minus missing features like undo and select.
And of course, JACK support. Aside from a few xruns, it should run flawlessly. Hopefully it runs fine for the low latency JACK users (the lowest latency I can get is 85.3ms).
JACK users should run famitracker-play.sh or famitracker-qt.sh with the argument "-sound jack".
Sorry for double post, but i upgraded boost to 1.50 and now it compiles, but i got linker error (yay! :P)
Quote:
Linking CXX executable famitracker-qt
/usr/bin/ld: CMakeFiles/famitracker-qt.dir/gui.cpp.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/bin/ld: note: '_ZN5boost6system15system_categoryEv' is defined in DSO /usr/lib/libboost_system.so.1.50.0 so try adding it to the linker command line
/usr/lib/libboost_system.so.1.50.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make[2]: *** [src/qt-gui/famitracker-qt] Błąd 1
make[1]: *** [src/qt-gui/CMakeFiles/famitracker-qt.dir/all] Błąd 2
make: *** [all] Błąd 2
Your magic command did not really work, but i added "system" manually in several CMakeLists.txt and it works!
I experienced those "semi-rare crashes", and sometimes program just freezes and does not respond to anything(it happened to me twice). I also find that bug with disappearing panel really annoying :P
Instrument editor works almost like the original one(however it lacks this "drawing line with right mouse button" feature, and i used that one very often).
Anyway, great job! Im looking forward to next preview!
To celebrate the occasion, i attached FTM made entirely in this Famitracker version!
Your magic command did not really work, but i added "system" manually in several CMakeLists.txt and it works!
Cool! My magic is a little rusty, but that's the idea.
I don't want to add boost_system for versions under 1.50 because it's a useless dependency. I might do a version check for the next update.
PJ wrote:
I experienced those "semi-rare crashes", and sometimes program just freezes and does not respond to anything(it happened to me twice).
Well, shit. I thought I squashed all those stupid threading issues.
To anyone getting freezing or crashing and wants to help:
Build a debug version. Either redo the compile instructions with -DCMAKE_BUILD_TYPE=Debug, or reconfigure your existing famitracker-bin with "cmake . -DCMAKE_BUILD_TYPE=Debug"
In the famitracker-bin directory, run "LD_LIBRARY_PATH=./src/sound/ gdb ./src/qt-gui/famitracker-qt". Type "run" to start the program.
Ctrl+C whenever the program freezes. Enter "thread apply all bt". Post the results.
(the LD_LIBRARY_PATH nonsense is to load the sound modules. otherwise the program won't start)
If you have an IDE that recognizes cmake (like Qt Creator), that works too. It just needs to be configured with LD_LIBRARY_PATH.
PJ wrote:
I also find that bug with disappearing panel really annoying :P
That should really be dealt with. It's pissing me off, too.
I did a little investigation; it's a Qt bug that makes the visibilityChanged(bool) signal inconsistent with isVisible().
For now, comment out line 40 of qt-gui/MainWindow.cpp.
PJ wrote:
Instrument editor works almost like the original one(however it lacks this "drawing line with right mouse button" feature, and i used that one very often).
The sequence editor is done, apart from three things: Arpeggio scrolling, DPCM import/previewing/editing, and line drawing. I'll get them working next time around.
EDIT: Four things, including the graphical keyboard.
PJ wrote:
Anyway, great job! Im looking forward to next preview!
To celebrate the occasion, i attached FTM made entirely in this Famitracker version!
I dont know if it counts as freezing, but suddenly I was unable to make any sound with the program, and also "Play" did not really play(no sound and cursor was in place, too).
Quote:
^C
Program received signal SIGINT, Interrupt.
0xb7fdd424 in __kernel_vsyscall ()
(gdb) thread apply all bt
Thread 15 (Thread 0xb2862b40 (LWP 13587)):
#0 0xb7fdd424 in __kernel_vsyscall ()
#1 0xb6e6d3f2 in __lll_lock_wait () from /lib/libpthread.so.0
#2 0xb6e68e64 in _L_lock_517 () from /lib/libpthread.so.0
#3 0xb6e68ca3 in pthread_mutex_lock () from /lib/libpthread.so.0
#4 0xb6f711f4 in pthread_mutex_lock () from /lib/libc.so.6
#5 0x08077b2e in boost::mutex::lock (this=0x8136f08) at /usr/include/boost/thread/pthread/mutex.hpp:64
#6 0xb7f9e5ec in SoundGen::requestSound (this=0x81464c0, buf=0xb3d02536, sz=541, idx=0x810dcfc) at /home/piotrek/Pobieranie/famitracker/src/famitracker-core/sound.cpp:503
#7 0xb7f9e56a in SoundGen::soundCallback (buf=0xb3d02170, sz=1024, data=0x81464c0, idx=0x810dcfc) at /home/piotrek/Pobieranie/famitracker/src/famitracker-core/sound.cpp:487
#8 0xb71828c7 in core::SoundSink::performSoundCallback (this=0x810dce0, buf=0xb3d02170, sz=1024) at /home/piotrek/Pobieranie/famitracker/src/core/soundsink.cpp:170
#9 0xb7f71460 in AlsaSound::callback (data=0x810dce0) at /home/piotrek/Pobieranie/famitracker/src/sound/alsa.cpp:60
#10 0xb7189e4d in core::SoundThread::_job (t=0x810de24, f=0xb7f7135c <AlsaSound::callback(void*)>, data=0x810dce0) at /home/piotrek/Pobieranie/famitracker/src/core/soundthread.cpp:50
#11 0xb718a7ec in boost::_bi::list3<boost::_bi::value<core::SoundThread*>, boost::_bi::value<void (*)(void*)>, boost::_bi::value<void*> >::operator()<void (*)(core::SoundThread*, void (*)(void*), void*), boost::_bi::list0> (this=0xb4700ef8, f=@0xb4700ef4: 0xb7189e3c <core::SoundThread::_job(core::SoundThread*, void (*)(void*), void*)>, a=...) at /usr/include/boost/bind/bind.hpp:392
#12 0xb718a75c in boost::_bi::bind_t<void, void (*)(core::SoundThread*, void (*)(void*), void*), boost::_bi::list3<boost::_bi::value<core::SoundThread*>, boost::_bi::value<void (*)(void*)>, boost::_bi::value<void*> > >::operator() (this=0xb4700ef4) at /usr/include/boost/bind/bind_template.hpp:20
#13 0xb718a70e in boost::detail::thread_data<boost::_bi::bind_t<void, void (*)(core::SoundThread*, void (*)(void*), void*), boost::_bi::list3<boost::_bi::value<core::SoundThread*>, boost::_bi::value<void (*)(void*)>, boost::_bi::value<void*> > > >::run (this=0xb4700df0) at /usr/include/boost/thread/detail/thread.hpp:74
#14 0xb71a4ed0 in ?? () from /lib/libboost_thread.so.1.50.0
#15 0xb6e66d08 in start_thread () from /lib/libpthread.so.0
#16 0xb6f638fe in clone () from /lib/libc.so.6
Thread 3 (Thread 0xb46ffb40 (LWP 13348)):
#0 0xb7fdd424 in __kernel_vsyscall ()
#1 0xb6e6a7fb in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
#2 0xb6f70fec in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libc.so.6
#3 0x080863e0 in boost::condition_variable_any::wait<boost::unique_lock<boost::mutex> > (this=0x810deb8, m=...) at /usr/include/boost/thread/pthread/condition_variable.hpp:145
#4 0xb7182706 in core::SoundSink::_timeloop_read (this=0x810dce0, tgt=..., skip=@0xb46ff1ec: 0) at /home/piotrek/Pobieranie/famitracker/src/core/soundsink.cpp:113
#5 0xb71827a4 in core::SoundSink::_timeloop (this=0x810dce0) at /home/piotrek/Pobieranie/famitracker/src/core/soundsink.cpp:127
#6 0xb7182891 in core::SoundSink::_timeloop_bootstrap (s=0x810dce0) at /home/piotrek/Pobieranie/famitracker/src/core/soundsink.cpp:165
#7 0xb7189c9b in boost::_bi::list1<boost::_bi::value<core::SoundSink*> >::operator()<void (*)(core::SoundSink*), boost::_bi::list0> (this=0x810e010, f=
@0x810e00c: 0xb7182874 <core::SoundSink::_timeloop_bootstrap(core::SoundSink*)>, a=...) at /usr/include/boost/bind/bind.hpp:253
#8 0xb71898e4 in boost::_bi::bind_t<void, void (*)(core::SoundSink*), boost::_bi::list1<boost::_bi::value<core::SoundSink*> > >::operator() (this=0x810e00c) at /usr/include/boost/bind/bind_template.hpp:20
#9 0xb7189390 in boost::detail::thread_data<boost::_bi::bind_t<void, void (*)(core::SoundSink*), boost::_bi::list1<boost::_bi::value<core::SoundSink*> > > >::run (this=0x810df08)
at /usr/include/boost/thread/detail/thread.hpp:74
#10 0xb71a4ed0 in ?? () from /lib/libboost_thread.so.1.50.0
#11 0xb6e66d08 in start_thread () from /lib/libpthread.so.0
#12 0xb6f638fe in clone () from /lib/libc.so.6
Thread 2 (Thread 0xb51bab40 (LWP 13347)):
#0 0xb7fdd424 in __kernel_vsyscall ()
#1 0xb6e6a7fb in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
#2 0xb6f70fec in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libc.so.6
#3 0xb71a5dfc in boost::thread::join() () from /lib/libboost_thread.so.1.50.0
#4 0xb7189e1e in core::SoundThread::wait (this=0x810de24) at /home/piotrek/Pobieranie/famitracker/src/core/soundthread.cpp:43
#5 0xb7189d45 in core::SoundThread::run (this=0x810de24, f=0xb7f7135c <AlsaSound::callback(void*)>, data=0x810dce0) at /home/piotrek/Pobieranie/famitracker/src/core/soundthread.cpp:22
#6 0xb7f716d9 in AlsaSound::setPlaying (this=0x810dce0, playing=true) at /home/piotrek/Pobieranie/famitracker/src/sound/alsa.cpp:108
#7 0xb7f9eed1 in SoundGen::auditionNote (this=0x81464c0, note=5, octave=3, instrument=0, channel=0) at /home/piotrek/Pobieranie/famitracker/src/famitracker-core/sound.cpp:734
#8 0x080765b9 in gui::auditionnote_thread (a=...) at /home/piotrek/Pobieranie/famitracker/src/qt-gui/gui.cpp:504
#9 0x08076732 in gui::func_threadpool_playing () at /home/piotrek/Pobieranie/famitracker/src/qt-gui/gui.cpp:558
#10 0x0807c92d in boost::detail::thread_data<void (*)()>::run (this=0x810d1f0) at /usr/include/boost/thread/detail/thread.hpp:74
#11 0xb71a4ed0 in ?? () from /lib/libboost_thread.so.1.50.0
#12 0xb6e66d08 in start_thread () from /lib/libpthread.so.0
#13 0xb6f638fe in clone () from /lib/libc.so.6
Thread 1 (Thread 0xb6998740 (LWP 13344)):
#0 0xb7fdd424 in __kernel_vsyscall ()
---Type <return> to continue, or q <return> to quit---
#1 0xb6f598cb in poll () from /lib/libc.so.6
#2 0xb6dbc15b in g_poll () from /lib/libglib-2.0.so.0
#3 0xb6dada50 in ?? () from /lib/libglib-2.0.so.0
#4 0xb6dadbb1 in g_main_context_iteration () from /lib/libglib-2.0.so.0
#5 0xb7362a21 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib/libQtCore.so.4
#6 0xb7681f2a in ?? () from /lib/libQtGui.so.4
#7 0xb732f6ec in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib/libQtCore.so.4
#8 0xb732f9e1 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib/libQtCore.so.4
#9 0xb7334c7a in QCoreApplication::exec() () from /lib/libQtCore.so.4
#10 0xb75cede4 in QApplication::exec() () from /lib/libQtGui.so.4
#11 0x0807607f in gui::spin () at /home/piotrek/Pobieranie/famitracker/src/qt-gui/gui.cpp:352
#12 0x08074f4c in main (argc=1, argv=0xbffff974) at /home/piotrek/Pobieranie/famitracker/src/qt-gui/main.cpp:62
(gdb)
Thanks to the stack trace PJ provided (thanks, PJ!), I identified the cause of the sound engine freezing. In Layman's terms (sort of), two threads (the ALSA engine thread and the gui thread pool) were waiting on the other to complete, and therefore never would. This is known as a deadlock, and is one of the many ugly faces of threads programming.
Also fixed was an unrelated locking bug in the DPCM editor.
The source and binaries have been updated.
EDIT (8/06/12): The fix I issued also introduced a regression that appears similar but not the same, and is now fixed. Because this comes from the current work tree, it also comes with more features in the again-updated version:
- Changing the effect column count
- Playing the current row (Ctrl+Return), and playing from the current row (Alt+Return). The latter is a feature I've always wanted to see in FamiTracker.
- Note notation in the noise channel is corrected