From: Robert J. <spa...@us...> - 2006-03-02 22:32:37
|
Update of /cvsroot/lmuse/muse/muse/driver In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22697/muse/driver Modified Files: Tag: REL07 dummyaudio.cpp Log Message: transport functions are now run asyncronous to avoid thread-lockup when used with extern sync Index: dummyaudio.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/driver/dummyaudio.cpp,v retrieving revision 1.3.2.4 retrieving revision 1.3.2.5 diff -C2 -d -r1.3.2.4 -r1.3.2.5 *** dummyaudio.cpp 21 Aug 2005 18:11:28 -0000 1.3.2.4 --- dummyaudio.cpp 2 Mar 2006 22:32:28 -0000 1.3.2.5 *************** *** 24,27 **** --- 24,39 ---- //--------------------------------------------------------- + enum Cmd { + trSeek, + trStart, + trStop + }; + + struct Msg { + enum Cmd cmd; + int arg; + }; + + class DummyAudioDevice : public AudioDevice { pthread_t dummyThread; *************** *** 29,32 **** --- 41,45 ---- public: + std::list<Msg> cmdQueue; Audio::State state; int _framePos; *************** *** 87,93 **** if(DEBUG_DUMMY) printf("DummyAudioDevice::startTransport playPos=%d\n", playPos); ! state = Audio::START_PLAY; audio->sync(state, playPos); ! state = Audio::PLAY; } virtual void stopTransport() { --- 100,110 ---- if(DEBUG_DUMMY) printf("DummyAudioDevice::startTransport playPos=%d\n", playPos); ! Msg trcmd; ! trcmd.cmd = trStart; ! trcmd.arg = playPos; ! cmdQueue.push_front(trcmd); ! /* state = Audio::START_PLAY; audio->sync(state, playPos); ! state = Audio::PLAY;*/ } virtual void stopTransport() { *************** *** 97,107 **** } virtual void seekTransport(unsigned pos) { ! if(DEBUG_DUMMY) ! printf("DummyAudioDevice::seekTransport frame =%d topos=%d\n",playPos,pos); playPos = pos; Audio::State tempState = state; state = Audio::START_PLAY; audio->sync(state, playPos); ! state = tempState; } virtual void setFreewheel(bool) {} --- 114,129 ---- } virtual void seekTransport(unsigned pos) { ! //if(DEBUG_DUMMY) ! printf("DummyAudioDevice::seekTransport frame=%d topos=%d\n",playPos,pos); ! Msg trcmd; ! trcmd.cmd = trSeek; ! trcmd.arg = pos; ! cmdQueue.push_front(trcmd); playPos = pos; + /* Audio::State tempState = state; state = Audio::START_PLAY; audio->sync(state, playPos); ! state = tempState;*/ } virtual void setFreewheel(bool) {} *************** *** 117,120 **** --- 139,143 ---- _framePos = 0; playPos = 0; + cmdQueue.clear(); } *************** *** 174,178 **** * consistent. */ ! tickRate = timer.setTimerFreq(tickRate); sampleRate = tickRate * segmentSize; timer.startTimer(); --- 197,201 ---- * consistent. */ ! tickRate = timer.setTimerFreq( /*250*/ tickRate ); sampleRate = tickRate * segmentSize; timer.startTimer(); *************** *** 214,236 **** } undoSetuid(); - unsigned long tick = 0; for (;;) { - int _pollWait = 10; // ms - unsigned long count = 0; ! while (count < 1) // will loop until the next tick occurs { int n = poll(&myPollFd, 1 /* npfd */, _pollWait); ! ! count = timer.getTimerTicks(); ! } audio->process(segmentSize); ! ! int increment = 1; //tickRate / sampleRate * segmentSize; ! drvPtr->_framePos+=increment; if (drvPtr->state == Audio::PLAY) --- 237,277 ---- } undoSetuid(); unsigned long tick = 0; for (;;) { int _pollWait = 10; // ms unsigned long count = 0; ! while (count < 1 /*250/tickRate*/) // will loop until the next tick occurs { int n = poll(&myPollFd, 1 /* npfd */, _pollWait); ! count += timer.getTimerTicks(); ! while (drvPtr->cmdQueue.size()) ! { ! Msg &msg = drvPtr->cmdQueue.back(); ! drvPtr->cmdQueue.pop_back(); ! switch(msg.cmd) { ! case trSeek: ! printf("trSeek\n"); ! drvPtr->playPos = msg.arg; ! Audio::State tempState = drvPtr->state; ! drvPtr->state = Audio::START_PLAY; ! audio->sync(drvPtr->state, msg.arg); ! drvPtr->state = tempState; ! break; ! case trStart: ! printf("trStart\n"); ! drvPtr->state = Audio::START_PLAY; ! audio->sync(drvPtr->state, msg.arg); ! drvPtr->state = Audio::PLAY; ! break; ! case trStop: ! break; ! default: ! printf("Woaaa\n"); ! } ! } } audio->process(segmentSize); ! int increment = segmentSize; // 1 //tickRate / sampleRate * segmentSize; drvPtr->_framePos+=increment; if (drvPtr->state == Audio::PLAY) |