diff options
Diffstat (limited to 'muse2/muse/driver')
-rw-r--r-- | muse2/muse/driver/audiodev.h | 1 | ||||
-rw-r--r-- | muse2/muse/driver/dummyaudio.cpp | 21 | ||||
-rw-r--r-- | muse2/muse/driver/jack.cpp | 45 | ||||
-rw-r--r-- | muse2/muse/driver/jackaudio.h | 1 |
4 files changed, 60 insertions, 8 deletions
diff --git a/muse2/muse/driver/audiodev.h b/muse2/muse/driver/audiodev.h index 08d6a9f0..d060b138 100644 --- a/muse2/muse/driver/audiodev.h +++ b/muse2/muse/driver/audiodev.h @@ -75,6 +75,7 @@ class AudioDevice { virtual void setPortName(void* p, const char* n) = 0; virtual void* findPort(const char* name) = 0; virtual QString portName(void* port) = 0; + virtual unsigned int portLatency(void* port, bool capture) const = 0; virtual int getState() = 0; virtual unsigned getCurFrame() const = 0; virtual bool isRealtime() = 0; diff --git a/muse2/muse/driver/dummyaudio.cpp b/muse2/muse/driver/dummyaudio.cpp index 172638b4..4e37bc33 100644 --- a/muse2/muse/driver/dummyaudio.cpp +++ b/muse2/muse/driver/dummyaudio.cpp @@ -135,6 +135,7 @@ class DummyAudioDevice : public AudioDevice { virtual QString portName(void*) { return QString("mops"); } + virtual unsigned int portLatency(void* /*port*/, bool /*capture*/) const { return 0; } virtual int getState() { // if(DEBUG_DUMMY) // printf("DummyAudioDevice::getState %d\n", state); @@ -224,17 +225,22 @@ DummyAudioDevice* dummyAudio = 0; DummyAudioDevice::DummyAudioDevice() { - // Added by Tim. p3.3.15 - // p3.3.30 - //posix_memalign((void**)&buffer, 16, sizeof(float) * dummyFrames); - - int rv = posix_memalign((void**)&buffer, 16, sizeof(float) * MusEGlobal::config.dummyAudioBufSize); + MusEGlobal::sampleRate = MusEGlobal::config.dummyAudioSampleRate; + MusEGlobal::segmentSize = MusEGlobal::config.dummyAudioBufSize; + int rv = posix_memalign((void**)&buffer, 16, sizeof(float) * MusEGlobal::segmentSize); if(rv != 0) { fprintf(stderr, "ERROR: DummyAudioDevice ctor: posix_memalign returned error:%d. Aborting!\n", rv); abort(); } - + if(MusEGlobal::config.useDenormalBias) + { + for(unsigned q = 0; q < MusEGlobal::segmentSize; ++q) + buffer[q] = MusEGlobal::denormalBias; + } + else + memset(buffer, 0, sizeof(float) * MusEGlobal::segmentSize); + dummyThread = 0; realtimeFlag = false; seekflag = false; @@ -310,9 +316,8 @@ static void* dummyLoop(void* ptr) // p3.3.30 //MusEGlobal::sampleRate = 25600; - MusEGlobal::sampleRate = MusEGlobal::config.dummyAudioSampleRate; //MusEGlobal::segmentSize = dummyFrames; - MusEGlobal::segmentSize = MusEGlobal::config.dummyAudioBufSize; +// MusEGlobal::segmentSize = MusEGlobal::config.dummyAudioBufSize; #if 0 //unsigned int tickRate = MusEGlobal::sampleRate / dummyFrames; unsigned int tickRate = MusEGlobal::sampleRate / MusEGlobal::segmentSize; diff --git a/muse2/muse/driver/jack.cpp b/muse2/muse/driver/jack.cpp index 3deaf160..b1321cbc 100644 --- a/muse2/muse/driver/jack.cpp +++ b/muse2/muse/driver/jack.cpp @@ -1557,6 +1557,51 @@ QString JackAudioDevice::portName(void* port) } //--------------------------------------------------------- +// portLatency +// If capture is true get the capture latency, +// otherwise get the playback latency. +//--------------------------------------------------------- + +unsigned int JackAudioDevice::portLatency(void* port, bool capture) const +{ + // TODO: Experimental code... Finish it... + + if(!checkJackClient(_client) || !port) + return 0; + + QString s(jack_port_name((jack_port_t*)port)); + //fprintf(stderr, "Jack::portName %p %s\n", port, s.toLatin1().constData()); + + jack_latency_range_t p_range; + jack_port_get_latency_range((jack_port_t*)port, JackPlaybackLatency, &p_range); + //fprintf(stderr, "JackAudioDevice::portLatency playback min:%u max:%u\n", p_range.min, p_range.max); + if(p_range.max != p_range.min) + { + //fprintf(stderr, "JackAudioDevice::portLatency min:%u != max:%u\n", p_range.min, p_range.max); + //return (p_range.max - p_range.min) / 2; + } + + jack_latency_range_t c_range; + jack_port_get_latency_range((jack_port_t*)port, JackCaptureLatency, &c_range); + //fprintf(stderr, "JackAudioDevice::portLatency capture min:%u max:%u\n", c_range.min, c_range.max); + if(c_range.max != c_range.min) + { + //fprintf(stderr, "JackAudioDevice::portLatency capture min:%u != max:%u\n", c_range.min, c_range.max); + + // TODO TEST Decide which method to use. Although, it is arbitrary. + //return (c_range.max - c_range.min) / 2; + //return c_range.max; + } + + if(capture) + //return (c_range.max - c_range.min) / 2; + return c_range.max; + + //return (p_range.max - p_range.min) / 2; + return p_range.max; +} + +//--------------------------------------------------------- // unregisterPort //--------------------------------------------------------- diff --git a/muse2/muse/driver/jackaudio.h b/muse2/muse/driver/jackaudio.h index aab60d88..fd47de07 100644 --- a/muse2/muse/driver/jackaudio.h +++ b/muse2/muse/driver/jackaudio.h @@ -96,6 +96,7 @@ class JackAudioDevice : public AudioDevice { virtual void setPortName(void* p, const char* n) { jack_port_set_name((jack_port_t*)p, n); } virtual void* findPort(const char* name); virtual QString portName(void* port); + virtual unsigned int portLatency(void* port, bool capture) const; virtual int getState(); virtual unsigned int getCurFrame() const; virtual bool isRealtime() { return jack_is_realtime(_client); } |