| Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_audio.cc
|
| diff --git a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_audio.cc b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_audio.cc
|
| index 18558e6370a576a8848024d31cb1264e2047642f..6a4cfd9d7bfbe0de3a887a7f808eea3e29997e4e 100644
|
| --- a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_audio.cc
|
| +++ b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_audio.cc
|
| @@ -30,6 +30,10 @@ size_t ceil64k(size_t n) {
|
| return (n + 0xFFFF) & (~0xFFFF);
|
| }
|
|
|
| +// Hard coded values from PepperPlatformAudioOutputImpl.
|
| +// TODO(???): PPAPI shouldn't hard code these values for all clients.
|
| +enum { kChannels = 2, kBytesPerSample = 2 };
|
| +
|
| } // namespace
|
|
|
| PluginAudio::PluginAudio() :
|
| @@ -42,7 +46,8 @@ PluginAudio::PluginAudio() :
|
| thread_id_(),
|
| thread_active_(false),
|
| user_callback_(NULL),
|
| - user_data_(NULL) {
|
| + user_data_(NULL),
|
| + audio_buffer_size_(0) {
|
| DebugPrintf("PluginAudio::PluginAudio\n");
|
| }
|
|
|
| @@ -53,10 +58,13 @@ PluginAudio::~PluginAudio() {
|
| GetInterface()->StopPlayback(resource_);
|
| // Unmap the shared memory buffer, if present.
|
| if (shm_buffer_) {
|
| + audio_bus_.reset();
|
| + audio_buffer_.reset();
|
| munmap(shm_buffer_,
|
| ceil64k(media::TotalSharedMemorySizeInBytes(shm_size_)));
|
| shm_buffer_ = NULL;
|
| shm_size_ = 0;
|
| + audio_buffer_size_ = 0;
|
| }
|
| // Close the handles.
|
| if (shm_ != -1) {
|
| @@ -87,9 +95,15 @@ void PluginAudio::AudioThread(void* self) {
|
| if ((sizeof(sync_value) != r) || (-1 == sync_value))
|
| break;
|
| // Invoke user callback, get next buffer of audio data.
|
| - audio->user_callback_(audio->shm_buffer_,
|
| - audio->shm_size_,
|
| + audio->user_callback_(audio->audio_buffer_.get(),
|
| + audio->audio_buffer_size_,
|
| audio->user_data_);
|
| +
|
| + // Deinterleave the audio data into the shared memory as float.
|
| + audio->audio_bus_->FromInterleaved(
|
| + audio->audio_buffer_.get(), audio->audio_bus_->frames(),
|
| + kBytesPerSample);
|
| +
|
| // Signal audio backend by writing buffer length at end of buffer.
|
| // (Note: NaCl applications will always write the entire buffer.)
|
| media::SetActualDataSizeInBytes(audio->shm_buffer_,
|
| @@ -112,6 +126,14 @@ void PluginAudio::StreamCreated(NaClSrpcImcDescType socket,
|
| shm,
|
| 0);
|
| if (MAP_FAILED != shm_buffer_) {
|
| + // Deduce the frame count from the size using hard coded channel count.
|
| + audio_bus_ = media::AudioBus::WrapMemory(
|
| + kChannels, shm_size_ / (sizeof(float) * kChannels), shm_buffer_);
|
| + // Setup integer audio buffer for user audio data.
|
| + audio_buffer_size_ =
|
| + audio_bus_->frames() * audio_bus_->channels() * kBytesPerSample;
|
| + audio_buffer_.reset(new uint8_t[audio_buffer_size_]);
|
| +
|
| if (state() == AUDIO_PENDING) {
|
| StartAudioThread();
|
| } else {
|
| @@ -126,6 +148,7 @@ bool PluginAudio::StartAudioThread() {
|
| // clear contents of shm buffer before spinning up audio thread
|
| DebugPrintf("PluginAudio::StartAudioThread\n");
|
| memset(shm_buffer_, 0, shm_size_);
|
| + memset(audio_buffer_.get(), 0, audio_buffer_size_);
|
| const struct PP_ThreadFunctions* thread_funcs = GetThreadCreator();
|
| if (NULL == thread_funcs->thread_create ||
|
| NULL == thread_funcs->thread_join) {
|
|
|