Add a new parameter |latency| to PPB_AudioInput_Callback.
This CL updates the version of PPB_AudioInput_Dev and PPB_AudioInput_Callback; it also adds a new type PP_TimeDelta.
BUG=240900
TEST=None
Review URL: https://chromiumcodereview.appspot.com/14619033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@209965 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/proxy/audio_input_resource.cc b/ppapi/proxy/audio_input_resource.cc
index 487df296..4a7afff 100644
--- a/ppapi/proxy/audio_input_resource.cc
+++ b/ppapi/proxy/audio_input_resource.cc
@@ -14,6 +14,7 @@
#include "ppapi/proxy/resource_message_params.h"
#include "ppapi/proxy/serialized_handle.h"
#include "ppapi/shared_impl/ppapi_globals.h"
+#include "ppapi/shared_impl/ppb_audio_config_shared.h"
#include "ppapi/shared_impl/resource_tracker.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/enter.h"
@@ -29,9 +30,11 @@
open_state_(BEFORE_OPEN),
capturing_(false),
shared_memory_size_(0),
+ audio_input_callback_0_2_(NULL),
audio_input_callback_(NULL),
user_data_(NULL),
- enumeration_helper_(this) {
+ enumeration_helper_(this),
+ bytes_per_second_(0) {
SendCreate(RENDERER, PpapiHostMsg_AudioInput_Create());
}
@@ -68,47 +71,23 @@
return enumeration_helper_.MonitorDeviceChange(callback, user_data);
}
+int32_t AudioInputResource::Open0_2(
+ PP_Resource device_ref,
+ PP_Resource config,
+ PPB_AudioInput_Callback_0_2 audio_input_callback_0_2,
+ void* user_data,
+ scoped_refptr<TrackedCallback> callback) {
+ return CommonOpen(device_ref, config, audio_input_callback_0_2, NULL,
+ user_data, callback);
+}
+
int32_t AudioInputResource::Open(PP_Resource device_ref,
PP_Resource config,
PPB_AudioInput_Callback audio_input_callback,
void* user_data,
scoped_refptr<TrackedCallback> callback) {
- std::string device_id;
- // |device_id| remains empty if |device_ref| is 0, which means the default
- // device.
- if (device_ref != 0) {
- thunk::EnterResourceNoLock<thunk::PPB_DeviceRef_API> enter_device_ref(
- device_ref, true);
- if (enter_device_ref.failed())
- return PP_ERROR_BADRESOURCE;
- device_id = enter_device_ref.object()->GetDeviceRefData().id;
- }
-
- if (TrackedCallback::IsPending(open_callback_))
- return PP_ERROR_INPROGRESS;
- if (open_state_ != BEFORE_OPEN)
- return PP_ERROR_FAILED;
-
- if (!audio_input_callback)
- return PP_ERROR_BADARGUMENT;
- thunk::EnterResourceNoLock<thunk::PPB_AudioConfig_API> enter_config(config,
- true);
- if (enter_config.failed())
- return PP_ERROR_BADARGUMENT;
-
- config_ = config;
- audio_input_callback_ = audio_input_callback;
- user_data_ = user_data;
- open_callback_ = callback;
-
- PpapiHostMsg_AudioInput_Open msg(
- device_id, enter_config.object()->GetSampleRate(),
- enter_config.object()->GetSampleFrameCount());
- Call<PpapiPluginMsg_AudioInput_OpenReply>(
- RENDERER, msg,
- base::Bind(&AudioInputResource::OnPluginMsgOpenReply,
- base::Unretained(this)));
- return PP_OK_COMPLETIONPENDING;
+ return CommonOpen(device_ref, config, NULL, audio_input_callback, user_data,
+ callback);
}
PP_Resource AudioInputResource::GetCurrentConfig() {
@@ -235,8 +214,8 @@
void AudioInputResource::StartThread() {
// Don't start the thread unless all our state is set up correctly.
- if (!audio_input_callback_ || !socket_.get() || !capturing_ ||
- !shared_memory_->memory()) {
+ if ((!audio_input_callback_0_2_ && !audio_input_callback_) ||
+ !socket_.get() || !capturing_ || !shared_memory_->memory()) {
return;
}
DCHECK(!audio_input_thread_.get());
@@ -270,10 +249,66 @@
// While closing the stream, we may receive buffers whose size is different
// from |data_buffer_size|.
CHECK_LE(buffer->params.size, data_buffer_size);
- if (buffer->params.size > 0)
- audio_input_callback_(&buffer->audio[0], buffer->params.size, user_data_);
+ if (buffer->params.size > 0) {
+ if (audio_input_callback_) {
+ PP_TimeDelta latency =
+ static_cast<double>(pending_data) / bytes_per_second_;
+ audio_input_callback_(&buffer->audio[0], buffer->params.size, latency,
+ user_data_);
+ } else {
+ audio_input_callback_0_2_(&buffer->audio[0], buffer->params.size,
+ user_data_);
+ }
+ }
}
}
+int32_t AudioInputResource::CommonOpen(
+ PP_Resource device_ref,
+ PP_Resource config,
+ PPB_AudioInput_Callback_0_2 audio_input_callback_0_2,
+ PPB_AudioInput_Callback audio_input_callback,
+ void* user_data,
+ scoped_refptr<TrackedCallback> callback) {
+ std::string device_id;
+ // |device_id| remains empty if |device_ref| is 0, which means the default
+ // device.
+ if (device_ref != 0) {
+ thunk::EnterResourceNoLock<thunk::PPB_DeviceRef_API> enter_device_ref(
+ device_ref, true);
+ if (enter_device_ref.failed())
+ return PP_ERROR_BADRESOURCE;
+ device_id = enter_device_ref.object()->GetDeviceRefData().id;
+ }
+
+ if (TrackedCallback::IsPending(open_callback_))
+ return PP_ERROR_INPROGRESS;
+ if (open_state_ != BEFORE_OPEN)
+ return PP_ERROR_FAILED;
+
+ if (!audio_input_callback_0_2 && !audio_input_callback)
+ return PP_ERROR_BADARGUMENT;
+ thunk::EnterResourceNoLock<thunk::PPB_AudioConfig_API> enter_config(config,
+ true);
+ if (enter_config.failed())
+ return PP_ERROR_BADARGUMENT;
+
+ config_ = config;
+ audio_input_callback_0_2_ = audio_input_callback_0_2;
+ audio_input_callback_ = audio_input_callback;
+ user_data_ = user_data;
+ open_callback_ = callback;
+ bytes_per_second_ = kAudioInputChannels * (kBitsPerAudioInputSample / 8) *
+ enter_config.object()->GetSampleRate();
+
+ PpapiHostMsg_AudioInput_Open msg(
+ device_id, enter_config.object()->GetSampleRate(),
+ enter_config.object()->GetSampleFrameCount());
+ Call<PpapiPluginMsg_AudioInput_OpenReply>(
+ RENDERER, msg,
+ base::Bind(&AudioInputResource::OnPluginMsgOpenReply,
+ base::Unretained(this)));
+ return PP_OK_COMPLETIONPENDING;
+}
} // namespace proxy
} // namespace ppapi