#ifndef MEDIA_AUDIO_ALSA_ALSA_INPUT_H_
#define MEDIA_AUDIO_ALSA_ALSA_INPUT_H_
#include <alsa/asoundlib.h>
#include <stdint.h>
#include <memory>
#include <string>
#include "base/compiler_specific.h"
#include "base/memory/raw_ptr.h"
#include "base/threading/thread.h"
#include "base/time/time.h"
#include "media/audio/agc_audio_stream.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_parameters.h"
namespace media {
class AlsaWrapper;
class AudioManagerBase;
class MEDIA_EXPORT AlsaPcmInputStream
: public AgcAudioStream<AudioInputStream> {
public:
static const char kAutoSelectDevice[];
AlsaPcmInputStream(AudioManagerBase* audio_manager,
const std::string& device_name,
const AudioParameters& params,
AlsaWrapper* wrapper);
AlsaPcmInputStream(const AlsaPcmInputStream&) = delete;
AlsaPcmInputStream& operator=(const AlsaPcmInputStream&) = delete;
~AlsaPcmInputStream() override;
OpenOutcome Open() override;
void Start(AudioInputCallback* callback) override;
void Stop() override;
void Close() override;
double GetMaxVolume() override;
void SetVolume(double volume) override;
double GetVolume() override;
bool IsMuted() override;
void SetOutputDeviceForAec(const std::string& output_device_id) override;
private:
void HandleError(const char* method, int error);
void ReadAudio();
bool Recover(int error);
void StopRunningOnCaptureThread();
raw_ptr<AudioManagerBase> audio_manager_;
std::string device_name_;
AudioParameters params_;
int bytes_per_buffer_;
raw_ptr<AlsaWrapper> wrapper_;
base::TimeDelta buffer_duration_;
raw_ptr<AudioInputCallback> callback_;
base::TimeTicks next_read_time_;
raw_ptr<snd_pcm_t>
device_handle_;
raw_ptr<snd_mixer_t> mixer_handle_;
raw_ptr<snd_mixer_elem_t>
mixer_element_handle_;
std::unique_ptr<uint8_t[]> audio_buffer_;
bool read_callback_behind_schedule_;
std::unique_ptr<AudioBus> audio_bus_;
base::Thread capture_thread_;
bool running_;
};
}
#endif