summaryrefslogtreecommitdiff
path: root/muse2/muse/driver
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/driver')
-rw-r--r--muse2/muse/driver/audiodev.h1
-rw-r--r--muse2/muse/driver/dummyaudio.cpp21
-rw-r--r--muse2/muse/driver/jack.cpp45
-rw-r--r--muse2/muse/driver/jackaudio.h1
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); }