#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
#include <memory>
#include <string>
#include "base/memory/ref_counted.h"
#include "ipc/ipc_message.h"
#include "media/audio/audio_input_ipc.h"
#include "media/base/audio_capturer_source.h"
#include "media/base/audio_parameters.h"
#include "third_party/blink/public/common/tokens/tokens.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace media {
class AudioParameters;
}
namespace content {
class PepperAudioInputHost;
class PepperMediaDeviceManager;
class PepperPlatformAudioInput
: public media::AudioInputIPCDelegate,
public base::RefCountedThreadSafe<PepperPlatformAudioInput> {
public:
static PepperPlatformAudioInput* Create(
int render_frame_id,
const std::string& device_id,
int sample_rate,
int frames_per_buffer,
PepperAudioInputHost* client);
PepperPlatformAudioInput(const PepperPlatformAudioInput&) = delete;
PepperPlatformAudioInput& operator=(const PepperPlatformAudioInput&) = delete;
void StartCapture();
void StopCapture();
void ShutDown();
void OnStreamCreated(base::ReadOnlySharedMemoryRegion shared_memory_region,
base::SyncSocket::ScopedHandle socket_handle,
bool initially_muted) override;
void OnError(media::AudioCapturerSource::ErrorCode code) override;
void OnMuted(bool is_muted) override;
void OnIPCClosed() override;
protected:
~PepperPlatformAudioInput() override;
private:
friend class base::RefCountedThreadSafe<PepperPlatformAudioInput>;
PepperPlatformAudioInput();
bool Initialize(int render_frame_id,
const std::string& device_id,
int sample_rate,
int frames_per_buffer,
PepperAudioInputHost* client);
void InitializeOnIOThread(const base::UnguessableToken& session_id);
void StartCaptureOnIOThread();
void StopCaptureOnIOThread();
void ShutDownOnIOThread();
void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
void CloseDevice();
void NotifyStreamCreationFailed();
PepperMediaDeviceManager* GetMediaDeviceManager();
PepperAudioInputHost* client_ = nullptr;
std::unique_ptr<media::AudioInputIPC> ipc_;
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
int render_frame_id_ = MSG_ROUTING_NONE;
blink::LocalFrameToken render_frame_token_;
std::string label_;
media::AudioParameters params_;
bool create_stream_sent_ = false;
bool pending_open_device_ = false;
int pending_open_device_id_ = -1;
enum { kIdle, kStarted, kStopped } ipc_startup_state_ = kIdle;
};
}
#endif