doubango/plugins/audio_opensles/audio_opensles_device.h
175b478c
 /* Copyright (C) 2012 Doubango Telecom <http://www.doubango.org>
 *	
 * This file is part of Open Source Doubango Framework.
 *
 * DOUBANGO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *	
 * DOUBANGO is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *	
 * You should have received a copy of the GNU General Public License
 * along with DOUBANGO.
 */
 #include "audio_opensles_config.h"
 
 #ifndef _DOUBANGO_AUDIO_OPENSLES_SLDEVICE_H
 #define _DOUBANGO_AUDIO_OPENSLES_SLDEVICE_H
 
 #if AUDIO_OPENSLES_UNDER_ANDROID
 #	include <SLES/OpenSLES.h>
 #	include <SLES/OpenSLES_Android.h>
 #	include <SLES/OpenSLES_AndroidConfiguration.h>
 #endif
 
 #define BYTES_PER_SAMPLE 2
 #define BYTES_PER_SAMPLE_LOG2 1
 
 #define PLAYOUT_BUFFER_SIZE	10 // millis
 #define PLAYOUT_SAMPLE_RATE	16000
 #define RECORDING_BUFFER_SIZE	10
 #define RECORDING_SAMPLE_RATE	16000
 
 // max buffer size = 10 ms @ 48 kHz
 #define REC_BUF_SIZE_IN_SAMPLES 480
 #define PLAY_BUF_SIZE_IN_SAMPLES 480
 
 #define N_MAX_INTERFACES 4
 #define N_PLAY_QUEUE_BUFFERS 5
 #define N_REC_QUEUE_BUFFERS 5
 #define N_REC_BUFFERS 20
 
 class SLAudioDeviceCallback
 {
 public:
     virtual int32_t RecordedDataIsAvailable(const void* audioSamples,
                                             const uint32_t nSamples,
                                             const uint8_t nBytesPerSample,
                                             const uint8_t nChannels,
                                             const uint32_t samplesPerSec) = 0;   
 
     virtual int32_t NeedMorePlayData(const uint32_t nSamples,
                                      const uint8_t nBytesPerSample,
                                      const uint8_t nChannels,
                                      const uint32_t samplesPerSec,
                                      void* audioSamples,
                                      uint32_t& nSamplesOut) = 0;
 
 protected:
     virtual ~SLAudioDeviceCallback() {}
 };
 
 class SLAudioDevice
 {
 public:
 	SLAudioDevice(const SLAudioDeviceCallback* pCallback = NULL);
 	virtual ~SLAudioDevice();
 
 public:
 	int SetCallback(const SLAudioDeviceCallback* pCallback);
 	int Init();
 	bool Initialized();
 	int SpeakerIsAvailable(bool *pAvailable);
 	int InitSpeaker();
 	int SetMaxSpeakerVolume(int nMaxSpeakerVolume);
 	int SetMinSpeakerVolume(int nMinSpeakerVolume);
 	int SetSpeakerVolume(int nSpeakerVolume);
 	int GetSpeakerVolume();
 	int SetSpeakerOn(bool bSpeakerOn);
 	int PlayoutIsAvailable(bool *pAvailable);
 	int SetStereoPlayout(bool bEnabled);
 	int SetPlayoutBuffer(int nPlayoutBufferSize);
 	int SetPlayoutSampleRate(int nPlayoutSampleRate);
 	int InitPlayout();
 	int StereoPlayout(bool *pEnabled);
 	int PlayoutSampleRate(int *pPlayoutSampleRate);
 	int StartPlayout();
 	bool Playing();
 	int StopPlayout();
 	int RecordingIsAvailable(bool *pAvailable);
 	int MicrophoneIsAvailable(bool *pAvailable);
 	int InitMicrophone();
 	int SetMicrophoneVolume(int nMicrophoneVolume);
 	int SetStereoRecording(bool bEnabled);
 	int SetRecordingSampleRate(int nRecordingSampleRate);
 	int InitRecording();
 	int StereoRecording(bool *pEnabled);
 	int RecordingSampleRate(int *pRecordingSampleRate);
 	int StartRecording();
 	bool Recording();
 	int StopRecording();
 	int Terminate();
 
 private:
 	int PlayoutApplyNewConfig();
 	uint32_t PullPlayoutData(void* pAudioSamples, const uint32_t nSamples);
 	void PushRecordingData(void* pAudioSamples, const uint32_t nSamples);
 #if AUDIO_OPENSLES_UNDER_ANDROID
 	static void PlayerSimpleBufferQueueCallback(SLAndroidSimpleBufferQueueItf queueItf, void *pContext);
 	static void RecorderSimpleBufferQueueCallback(SLAndroidSimpleBufferQueueItf queueItf, void *pContext);
 #endif
 
 private:
 	const SLAudioDeviceCallback* m_pCallback;
 	int m_nMicDeviceId;
 	bool m_bInitialized;
 	bool m_bSpeakerInitialized;
 	bool m_bPlayoutInitialized;
 	bool m_bRecordingInitialized;
 	bool m_bMicrophoneInitialized;
 	bool m_bSpeakerOn;
 	bool m_bStereoPlayout;
 	bool m_bStereoRecording;
 	int m_nPlayoutBufferSize;
 	int m_nRecordingBufferSize;
 	int m_nPlayoutSampleRate;
 	int m_nRecordingSampleRate;
 	bool m_bPlaying;
 	bool m_bRecording;
 	int m_nSpeakerVolume;
 	int m_nMaxSpeakerVolume;
 	int m_nMinSpeakerVolume;
 
 #if AUDIO_OPENSLES_UNDER_ANDROID
 	// audio unit
     SLObjectItf m_slEngineObject;
 
     // playout device
     SLObjectItf m_slPlayer;
     SLEngineItf m_slEngine;
     SLPlayItf m_slPlayerPlay;
     SLAndroidSimpleBufferQueueItf m_slPlayerSimpleBufferQueue;
     SLObjectItf m_slOutputMixObject;
     SLVolumeItf m_slSpeakerVolume;
 
     // recording device
     SLObjectItf m_slRecorder;
     SLRecordItf m_slRecorderRecord;
     SLAudioIODeviceCapabilitiesItf m_slAudioIODeviceCapabilities;
     SLAndroidSimpleBufferQueueItf m_slRecorderSimpleBufferQueue;
     SLDeviceVolumeItf m_slMicVolume;
 
 	int _recQueueSeq;
 
 	 // Playout buffer
 	uint8_t _playQueueBuffer[N_PLAY_QUEUE_BUFFERS][PLAY_BUF_SIZE_IN_SAMPLES << BYTES_PER_SAMPLE_LOG2];
     int _playQueueSeq;
     // Recording buffer
     uint8_t _recQueueBuffer[N_REC_QUEUE_BUFFERS][REC_BUF_SIZE_IN_SAMPLES << BYTES_PER_SAMPLE_LOG2];
     uint8_t _recBuffer[N_REC_BUFFERS][REC_BUF_SIZE_IN_SAMPLES << BYTES_PER_SAMPLE_LOG2];
     int _recLength[N_REC_BUFFERS];
     int _recSeqNumber[N_REC_BUFFERS];
     int _recCurrentSeq;
     // Current total size all data in buffers, used for delay estimate
     int _recBufferTotalSize;
 #endif
 };
 
 #endif /* _DOUBANGO_AUDIO_OPENSLES_SLDEVICE_H */