15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/audio_input_dev.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/resource_array_dev.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_AudioInput_Dev_0_2>() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PPB_AUDIO_INPUT_DEV_INTERFACE_0_2;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> const char* interface_name<PPB_AudioInput_Dev_0_3>() {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PPB_AUDIO_INPUT_DEV_INTERFACE_0_3;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_AudioInput_Dev_0_4>() {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PPB_AUDIO_INPUT_DEV_INTERFACE_0_4;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::AudioInput_Dev() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::AudioInput_Dev(const InstanceHandle& instance) {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_4>()->Create(
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        instance.pp_instance()));
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (has_interface<PPB_AudioInput_Dev_0_3>()) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_3>()->Create(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        instance.pp_instance()));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (has_interface<PPB_AudioInput_Dev_0_2>()) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PassRefFromConstructor(get_interface<PPB_AudioInput_Dev_0_2>()->Create(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance.pp_instance()));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioInput_Dev::~AudioInput_Dev() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::IsAvailable() {
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return has_interface<PPB_AudioInput_Dev_0_4>() ||
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         has_interface<PPB_AudioInput_Dev_0_3>() ||
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         has_interface<PPB_AudioInput_Dev_0_2>();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioInput_Dev::EnumerateDevices(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_AudioInput_Dev_0_4>()->EnumerateDevices(
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), callback.output(), callback.pp_completion_callback());
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_3>()) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_AudioInput_Dev_0_3>()->EnumerateDevices(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(), callback.output(), callback.pp_completion_callback());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_2>()) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!callback.pp_completion_callback().func)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ArrayOutputCallbackConverter is responsible to delete it.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceArray_Dev::ArrayOutputCallbackData* data =
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ResourceArray_Dev::ArrayOutputCallbackData(
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            callback.output(), callback.pp_completion_callback());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_AudioInput_Dev_0_2>()->EnumerateDevices(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(), &data->resource_array_output,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PP_MakeCompletionCallback(
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &ResourceArray_Dev::ArrayOutputCallbackConverter, data));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return callback.MayForce(PP_ERROR_NOINTERFACE);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t AudioInput_Dev::MonitorDeviceChange(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PP_MonitorDeviceChangeCallback callback,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void* user_data) {
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_AudioInput_Dev_0_4>()->MonitorDeviceChange(
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), callback, user_data);
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_3>()) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_AudioInput_Dev_0_3>()->MonitorDeviceChange(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(), callback, user_data);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_ERROR_NOINTERFACE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t AudioInput_Dev::Open(const DeviceRef_Dev& device_ref,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const AudioConfig& config,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PPB_AudioInput_Callback audio_input_callback,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             void* user_data,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const CompletionCallback& callback) {
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return get_interface<PPB_AudioInput_Dev_0_4>()->Open(
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource(), device_ref.pp_resource(), config.pp_resource(),
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        audio_input_callback, user_data, callback.pp_completion_callback());
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return callback.MayForce(PP_ERROR_NOINTERFACE);
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t AudioInput_Dev::Open(
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DeviceRef_Dev& device_ref,
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const AudioConfig& config,
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PPB_AudioInput_Callback_0_2 audio_input_callback_0_2,
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    void* user_data,
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const CompletionCallback& callback) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_3>()) {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_AudioInput_Dev_0_3>()->Open(
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(), device_ref.pp_resource(), config.pp_resource(),
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        audio_input_callback_0_2, user_data, callback.pp_completion_callback());
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_2>()) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return get_interface<PPB_AudioInput_Dev_0_2>()->Open(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pp_resource(), device_ref.pp_resource(), config.pp_resource(),
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        audio_input_callback_0_2, user_data, callback.pp_completion_callback());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return callback.MayForce(PP_ERROR_NOINTERFACE);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::StartCapture() {
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StartCapture(
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource()));
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_3>()) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StartCapture(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource()));
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_2>()) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StartCapture(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pp_resource()));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioInput_Dev::StopCapture() {
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_4>()->StopCapture(
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pp_resource()));
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_3>()) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_3>()->StopCapture(
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource()));
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_AudioInput_Dev_0_2>()) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(get_interface<PPB_AudioInput_Dev_0_2>()->StopCapture(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pp_resource()));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioInput_Dev::Close() {
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_AudioInput_Dev_0_4>()) {
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    get_interface<PPB_AudioInput_Dev_0_4>()->Close(pp_resource());
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else if (has_interface<PPB_AudioInput_Dev_0_3>()) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get_interface<PPB_AudioInput_Dev_0_3>()->Close(pp_resource());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (has_interface<PPB_AudioInput_Dev_0_2>()) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_AudioInput_Dev_0_2>()->Close(pp_resource());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
178