diff options
Diffstat (limited to 'src/device_zte.cpp')
-rw-r--r-- | src/device_zte.cpp | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/src/device_zte.cpp b/src/device_zte.cpp index 51bee75..d42808f 100644 --- a/src/device_zte.cpp +++ b/src/device_zte.cpp @@ -7,6 +7,7 @@ #include "MusicPlay.h" #include "device_zte.h" +#include "timer.h" #include "debug.h" @@ -35,39 +36,43 @@ namespace audiere { } ZteAudioDevice::ZteAudioDevice(int rate, - int buffer_size) - : MixerDevice(rate), m_rate(rate) + int buffer_size) + : ThreadedMixerDevice(rate, buffer_size, 8), m_rate(rate) { - m_buffer_size = buffer_size; - m_buffer = new char [buffer_size]; + m_initial_ts = GetNow(); + m_total = 0; } ZteAudioDevice::~ZteAudioDevice() { ADR_GUARD("ZteAudioDevice::~ZteAudioDevice"); + shutdown(); Music_device_close(0); - delete [] m_buffer; } void ADR_CALL - ZteAudioDevice::update() { - int sample_len; - size_t sample_left; - char* sample_buf; - - sample_buf = m_buffer; - sample_len = m_buffer_size / 4; - - sample_left = read(sample_len, sample_buf); - while (sample_left > 0) { - if (Music_device_write(sample_buf, sample_left * 4) < 0) { - AI_Sleep(2); - } else { - sample_left = 0; - } + ZteAudioDevice::outputBuffer(const char* buf, int buf_len) { + const u64 total_samples = m_total / 4; + const u64 total_time = total_samples * 1000000 / m_rate; + const u64 threshold = u64(1000000) * 1024 * 2 / m_rate; + u64 ts = GetNow(); + + if (m_total == 0) + m_initial_ts = ts; + + while (m_initial_ts + total_time > ts + threshold) { + u64 to_sleep = (m_initial_ts + total_time - ts - threshold) / 2000; + if (to_sleep < 2) + break; + + AI_Sleep(to_sleep); + ts = GetNow(); } + + Music_device_write((void*)buf, buf_len); + m_total += buf_len; } |