diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2012-05-08 11:28:26 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2012-05-16 18:09:03 +0800 |
commit | ff11c2a40f26327e9a6a8c415736607bdd9cccf5 (patch) | |
tree | 4306623ee0c8504b8e693f0e64d7e9d341a9aeb9 | |
parent | d80e08b9e39c6b10eb17cb2384d1134dc5454094 (diff) |
Wait for buffer availabe before writing on nexus
-rw-r--r-- | src/device_nexus.cpp | 33 | ||||
-rw-r--r-- | src/device_nexus.h | 2 |
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; |