summaryrefslogtreecommitdiff
path: root/src/device_zte.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/device_zte.cpp')
-rw-r--r--src/device_zte.cpp45
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;
}