diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2012-12-21 15:11:51 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2012-12-21 15:11:51 +0800 |
commit | de7d44338dcbcb285dbd2b92c25dcdadcf6ad572 (patch) | |
tree | 95808a53a4ec095fe3dcab375c6d0976f9170153 /src | |
parent | 1626408838eb480cbb53c8789711d7cdc56b495c (diff) |
Convert the zte audio device to a threaded mixer device
Diffstat (limited to 'src')
-rw-r--r-- | src/device_zte.cpp | 45 | ||||
-rw-r--r-- | src/device_zte.h | 8 |
2 files changed, 29 insertions, 24 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; } diff --git a/src/device_zte.h b/src/device_zte.h index dfbc849..cf98cb2 100644 --- a/src/device_zte.h +++ b/src/device_zte.h @@ -8,7 +8,7 @@ namespace audiere { - class ZteAudioDevice : public MixerDevice { + class ZteAudioDevice : public ThreadedMixerDevice { public: static ZteAudioDevice* create(const ParameterList& parameters); @@ -18,13 +18,13 @@ namespace audiere { ~ZteAudioDevice(); public: - void ADR_CALL update(); + virtual void outputBuffer(const char* buf, int buf_len); const char* ADR_CALL getName(); private: - int m_buffer_size; - char* m_buffer; int m_rate; + u64 m_initial_ts; + u64 m_total; }; } |