#ifndef REMOTING_HOST_AUDIO_CAPTURER_MAC_H_
#define REMOTING_HOST_AUDIO_CAPTURER_MAC_H_
#include <AudioToolbox/AudioToolbox.h>
#include <string>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "remoting/host/audio_capturer.h"
#include "remoting/host/audio_silence_detector.h"
namespace remoting {
class AudioCapturerMac : public AudioCapturer {
public:
struct AudioDeviceInfo {
std::string device_name;
std::string device_uid;
};
static std::vector<AudioDeviceInfo> GetAudioDevices();
explicit AudioCapturerMac(const std::string& audio_device_uid);
~AudioCapturerMac() override;
bool Start(const PacketCapturedCallback& callback) override;
AudioCapturerMac(const AudioCapturerMac&) = delete;
AudioCapturerMac& operator=(const AudioCapturerMac&) = delete;
private:
static void HandleInputBufferOnAQThread(
void* user_data,
AudioQueueRef aq,
AudioQueueBufferRef buffer,
const AudioTimeStamp* start_time,
UInt32 num_packets,
const AudioStreamPacketDescription* packet_descs);
void HandleInputBuffer(AudioQueueRef aq, AudioQueueBufferRef buffer);
bool StartInputQueue();
void DisposeInputQueue();
bool HandleError(OSStatus err, const char* function_name);
SEQUENCE_CHECKER(sequence_checker_);
std::string audio_device_uid_;
AudioStreamBasicDescription stream_description_;
AudioSilenceDetector silence_detector_;
PacketCapturedCallback callback_;
AudioQueueRef input_queue_ = nullptr;
bool is_started_ = false;
scoped_refptr<base::SequencedTaskRunner> caller_task_runner_;
base::WeakPtrFactory<AudioCapturerMac> weak_factory_{this};
};
}
#endif