summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2012-05-08 11:28:26 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2012-05-16 18:09:03 +0800
commitff11c2a40f26327e9a6a8c415736607bdd9cccf5 (patch)
tree4306623ee0c8504b8e693f0e64d7e9d341a9aeb9
parentd80e08b9e39c6b10eb17cb2384d1134dc5454094 (diff)
Wait for buffer availabe before writing on nexus
-rw-r--r--src/device_nexus.cpp33
-rw-r--r--src/device_nexus.h2
2 files changed, 26 insertions, 9 deletions
diff --git a/src/device_nexus.cpp b/src/device_nexus.cpp
index 25c1197..9d9e203 100644
--- a/src/device_nexus.cpp
+++ b/src/device_nexus.cpp
@@ -70,6 +70,8 @@ namespace audiere {
return;
NexusAudioDevice *device = (NexusAudioDevice*)pParam1;
+ ScopedLock lock(device->m_mutex);
+
if (device->m_event)
BKNI_SetEvent(device->m_event);
}
@@ -81,13 +83,14 @@ namespace audiere {
int rate,
int buffer_size)
: MixerDevice(rate), m_platform(platform), m_playback_id(playback_id),
- m_playback(playback), m_mixer(mixer), m_rate(rate)
+ m_playback(playback), m_mixer(mixer), m_rate(rate), m_paused(false)
{
m_display = platform->getDisplay();
m_buffer_size = buffer_size;
m_buffer = new char [buffer_size];
BKNI_CreateEvent(&m_event);
+ BKNI_SetEvent(m_event);
NEXUS_AudioPlayback_GetDefaultStartSettings(&m_playbackSettings);
m_playbackSettings.sampleRate = 44100;
m_playbackSettings.bitsPerSample = 16;
@@ -134,13 +137,21 @@ namespace audiere {
void NexusAudioDevice::pauseAudio()
{
printf("audiere: stopping audio playback.\n");
+ ScopedLock lock(m_mutex);
+
NEXUS_AudioPlayback_Stop(m_playback);
+ BKNI_ResetEvent(m_event);
+ m_paused = true;
}
void NexusAudioDevice::resumeAudio()
{
printf("audiere: starting audio playback.\n");
+ ScopedLock lock(m_mutex);
+
NEXUS_AudioPlayback_Start(m_playback, &m_playbackSettings);
+ BKNI_SetEvent(m_event);
+ m_paused = false;
}
void ADR_CALL
@@ -154,16 +165,25 @@ namespace audiere {
sample_left = read(sample_len, sample_buf);
while (sample_left > 0) {
- void *buffer;
- size_t buffersize;
+ void *buffer = 0;
+ size_t buffersize = 0;
BERR_Code err;
+ err = BKNI_WaitForEvent(m_event, 1000);
+ if (err)
+ break;
+
+ ScopedLock lock(m_mutex);
+
+ if (m_paused)
+ continue;
+
/* Check available buffer space */
err = NEXUS_AudioPlayback_GetBuffer(m_playback, (void **)&buffer, &buffersize);
if (err)
break;
- if (buffersize) {
+ if (buffersize && buffer) {
/* Copy samples into buffer */
size_t samples = buffersize / 4;
if (samples > sample_left)
@@ -176,11 +196,6 @@ namespace audiere {
sample_buf += samples * 4;
sample_left -= samples;
- } else {
- /* Wait for data callback */
- err = BKNI_WaitForEvent(m_event, 1000);
- if (err)
- break;
}
}
}
diff --git a/src/device_nexus.h b/src/device_nexus.h
index dcc5a40..8937580 100644
--- a/src/device_nexus.h
+++ b/src/device_nexus.h
@@ -56,6 +56,8 @@ namespace audiere {
NEXUS_AudioPlaybackHandle m_playback;
NEXUS_AudioPlaybackStartSettings m_playbackSettings;
NEXUS_AudioMixerHandle m_mixer;
+ Mutex m_mutex;
+ bool m_paused;
int m_buffer_size;
char* m_buffer;