#pragma once #include #include #include typedef void (*AndroidAudioCallback)(short *buffer, int numSamples, int sampleRateHz, void *userdata); class AudioContext { public: AudioContext(AndroidAudioCallback cb, int _FramesPerBuffer, int _SampleRate); virtual bool Init() { return false; } virtual bool AudioRecord_Start(int sampleRate) { return false; }; virtual bool AudioRecord_Stop() { return false; }; int SampleRate() const { return sampleRate; } virtual ~AudioContext() {} protected: static void SetErrorString(const std::string &error); AndroidAudioCallback audioCallback; int framesPerBuffer; int sampleRate; std::mutex errorMutex_; }; struct AndroidAudioState; // TODO: Get rid of this unnecessary wrapper layer from the old .so days // It's okay for optimalFramesPerBuffer and optimalSampleRate to be 0. Defaults will be used. AndroidAudioState *AndroidAudio_Init(AndroidAudioCallback cb, int optimalFramesPerBuffer, int optimalSampleRate); bool AndroidAudio_Recording_SetSampleRate(AndroidAudioState *state, int sampleRate); bool AndroidAudio_Recording_Start(AndroidAudioState *state); bool AndroidAudio_Recording_Stop(AndroidAudioState *state); // Microphone input is buffered: the input stream pushes it, and AndroidAudio_Recording_Poll hands it // over to Microphone::addAudioData. Poll and Clear are for the CPU thread. void AndroidAudio_Recording_Push(const int16_t *samples, int count); void AndroidAudio_Recording_Poll(); void AndroidAudio_Recording_Clear(); bool AndroidAudio_Pause(AndroidAudioState *state); bool AndroidAudio_Resume(AndroidAudioState *state); bool AndroidAudio_Shutdown(AndroidAudioState *state); const std::string AndroidAudio_GetErrorString(AndroidAudioState *state);