1 /* 2 ** Copyright 2008, The Android Open-Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 #ifndef ANDROID_AUDIO_HARDWARE_H 18 #define ANDROID_AUDIO_HARDWARE_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <utils/threads.h> 24 #include <utils/SortedVector.h> 25 26 #include <hardware_legacy/AudioHardwareBase.h> 27 28 #include "secril-client.h" 29 30 extern "C" { 31 struct pcm; 32 struct mixer; 33 struct mixer_ctl; 34 }; 35 36 namespace android { 37 38 // TODO: determine actual audio DSP and hardware latency 39 // Additionnal latency introduced by audio DSP and hardware in ms 40 #define AUDIO_HW_OUT_LATENCY_MS 0 41 // Default audio output sample rate 42 #define AUDIO_HW_OUT_SAMPLERATE 44100 43 // Default audio output channel mask 44 #define AUDIO_HW_OUT_CHANNELS (AudioSystem::CHANNEL_OUT_STEREO) 45 // Default audio output sample format 46 #define AUDIO_HW_OUT_FORMAT (AudioSystem::PCM_16_BIT) 47 // Kernel pcm out buffer size in frames at 44.1kHz 48 #define AUDIO_HW_OUT_PERIOD_MULT 8 // (8 * 128 = 1024 frames) 49 #define AUDIO_HW_OUT_PERIOD_SZ (PCM_PERIOD_SZ_MIN * AUDIO_HW_OUT_PERIOD_MULT) 50 #define AUDIO_HW_OUT_PERIOD_CNT 4 51 // Default audio output buffer size in bytes 52 #define AUDIO_HW_OUT_PERIOD_BYTES (AUDIO_HW_OUT_PERIOD_SZ * 2 * sizeof(int16_t)) 53 54 // Default audio input sample rate 55 #define AUDIO_HW_IN_SAMPLERATE 8000 56 // Default audio input channel mask 57 #define AUDIO_HW_IN_CHANNELS (AudioSystem::CHANNEL_IN_MONO) 58 // Default audio input sample format 59 #define AUDIO_HW_IN_FORMAT (AudioSystem::PCM_16_BIT) 60 // Number of buffers in audio driver for input 61 #define AUDIO_HW_NUM_IN_BUF 2 62 // Kernel pcm in buffer size in frames at 44.1kHz (before resampling) 63 #define AUDIO_HW_IN_PERIOD_MULT 16 // (16 * 128 = 2048 frames) 64 #define AUDIO_HW_IN_PERIOD_SZ (PCM_PERIOD_SZ_MIN * AUDIO_HW_IN_PERIOD_MULT) 65 #define AUDIO_HW_IN_PERIOD_CNT 2 66 // Default audio input buffer size in bytes (8kHz mono) 67 #define AUDIO_HW_IN_PERIOD_BYTES ((AUDIO_HW_IN_PERIOD_SZ*sizeof(int16_t))/8) 68 69 #define INPUT_SOURCE_KEY "Input Source" 70 71 class AudioHardware : public AudioHardwareBase 72 { 73 class AudioStreamOutALSA; 74 class AudioStreamInALSA; 75 public: 76 77 AudioHardware(); 78 virtual ~AudioHardware(); 79 virtual status_t initCheck(); 80 81 virtual status_t setVoiceVolume(float volume); 82 virtual status_t setMasterVolume(float volume); 83 84 virtual status_t setMode(int mode); 85 86 virtual status_t setMicMute(bool state); 87 virtual status_t getMicMute(bool* state); 88 89 virtual status_t setParameters(const String8& keyValuePairs); 90 virtual String8 getParameters(const String8& keys); 91 92 virtual AudioStreamOut* openOutputStream( 93 uint32_t devices, int *format=0, uint32_t *channels=0, 94 uint32_t *sampleRate=0, status_t *status=0); 95 96 virtual AudioStreamIn* openInputStream( 97 uint32_t devices, int *format, uint32_t *channels, 98 uint32_t *sampleRate, status_t *status, 99 AudioSystem::audio_in_acoustics acoustics); 100 101 virtual void closeOutputStream(AudioStreamOut* out); 102 virtual void closeInputStream(AudioStreamIn* in); 103 104 virtual size_t getInputBufferSize( 105 uint32_t sampleRate, int format, int channelCount); 106 107 int mode() { return mMode; } 108 const char *getOutputRouteFromDevice(uint32_t device); 109 const char *getInputRouteFromDevice(uint32_t device); 110 const char *getVoiceRouteFromDevice(uint32_t device); 111 112 status_t setIncallPath_l(uint32_t device); 113 114 status_t setInputSource_l(String8 source); 115 116 static uint32_t getInputSampleRate(uint32_t sampleRate); 117 sp <AudioStreamInALSA> getActiveInput_l(); 118 119 Mutex& lock() { return mLock; } 120 121 struct pcm *openPcmOut_l(); 122 void closePcmOut_l(); 123 124 struct mixer *openMixer_l(); 125 void closeMixer_l(); 126 127 sp <AudioStreamOutALSA> output() { return mOutput; } 128 129 protected: 130 virtual status_t dump(int fd, const Vector<String16>& args); 131 132 private: 133 134 bool mInit; 135 bool mMicMute; 136 sp <AudioStreamOutALSA> mOutput; 137 SortedVector < sp<AudioStreamInALSA> > mInputs; 138 Mutex mLock; 139 struct pcm* mPcm; 140 struct mixer* mMixer; 141 uint32_t mPcmOpenCnt; 142 uint32_t mMixerOpenCnt; 143 bool mInCallAudioMode; 144 145 String8 mInputSource; 146 bool mBluetoothNrec; 147 void* mSecRilLibHandle; 148 HRilClient mRilClient; 149 bool mActivatedCP; 150 HRilClient (*openClientRILD) (void); 151 int (*disconnectRILD) (HRilClient); 152 int (*closeClientRILD) (HRilClient); 153 int (*isConnectedRILD) (HRilClient); 154 int (*connectRILD) (HRilClient); 155 int (*setCallVolume) (HRilClient, SoundType, int); 156 int (*setCallAudioPath)(HRilClient, AudioPath); 157 int (*setCallClockSync)(HRilClient, SoundClockCondition); 158 void loadRILD(void); 159 status_t connectRILDIfRequired(void); 160 161 // trace driver operations for dump 162 int mDriverOp; 163 164 static uint32_t checkInputSampleRate(uint32_t sampleRate); 165 static const uint32_t inputSamplingRates[]; 166 167 class AudioStreamOutALSA : public AudioStreamOut, public RefBase 168 { 169 public: 170 AudioStreamOutALSA(); 171 virtual ~AudioStreamOutALSA(); 172 status_t set(AudioHardware* mHardware, 173 uint32_t devices, 174 int *pFormat, 175 uint32_t *pChannels, 176 uint32_t *pRate); 177 virtual uint32_t sampleRate() 178 const { return mSampleRate; } 179 virtual size_t bufferSize() 180 const { return mBufferSize; } 181 virtual uint32_t channels() 182 const { return mChannels; } 183 virtual int format() 184 const { return AUDIO_HW_OUT_FORMAT; } 185 virtual uint32_t latency() 186 const { return (1000 * AUDIO_HW_OUT_PERIOD_CNT * 187 (bufferSize()/frameSize()))/sampleRate() + 188 AUDIO_HW_OUT_LATENCY_MS; } 189 virtual status_t setVolume(float left, float right) 190 { return INVALID_OPERATION; } 191 virtual ssize_t write(const void* buffer, size_t bytes); 192 virtual status_t standby(); 193 bool checkStandby(); 194 195 virtual status_t dump(int fd, const Vector<String16>& args); 196 virtual status_t setParameters(const String8& keyValuePairs); 197 virtual String8 getParameters(const String8& keys); 198 uint32_t device() { return mDevices; } 199 virtual status_t getRenderPosition(uint32_t *dspFrames); 200 201 void doStandby_l(); 202 void close_l(); 203 status_t open_l(); 204 int standbyCnt() { return mStandbyCnt; } 205 206 void lock() { mLock.lock(); } 207 void unlock() { mLock.unlock(); } 208 209 private: 210 211 Mutex mLock; 212 AudioHardware* mHardware; 213 struct pcm *mPcm; 214 struct mixer *mMixer; 215 struct mixer_ctl *mRouteCtl; 216 const char *next_route; 217 bool mStandby; 218 uint32_t mDevices; 219 uint32_t mChannels; 220 uint32_t mSampleRate; 221 size_t mBufferSize; 222 // trace driver operations for dump 223 int mDriverOp; 224 int mStandbyCnt; 225 }; 226 227 class DownSampler; 228 229 class BufferProvider 230 { 231 public: 232 233 struct Buffer { 234 union { 235 void* raw; 236 short* i16; 237 int8_t* i8; 238 }; 239 size_t frameCount; 240 }; 241 242 virtual ~BufferProvider() {} 243 244 virtual status_t getNextBuffer(Buffer* buffer) = 0; 245 virtual void releaseBuffer(Buffer* buffer) = 0; 246 }; 247 248 class DownSampler { 249 public: 250 DownSampler(uint32_t outSampleRate, 251 uint32_t channelCount, 252 uint32_t frameCount, 253 BufferProvider* provider); 254 255 virtual ~DownSampler(); 256 257 void reset(); 258 status_t initCheck() { return mStatus; } 259 int resample(int16_t* out, size_t *outFrameCount); 260 261 private: 262 status_t mStatus; 263 BufferProvider* mProvider; 264 uint32_t mSampleRate; 265 uint32_t mChannelCount; 266 uint32_t mFrameCount; 267 int16_t *mInLeft; 268 int16_t *mInRight; 269 int16_t *mTmpLeft; 270 int16_t *mTmpRight; 271 int16_t *mTmp2Left; 272 int16_t *mTmp2Right; 273 int16_t *mOutLeft; 274 int16_t *mOutRight; 275 int mInInBuf; 276 int mInTmpBuf; 277 int mInTmp2Buf; 278 int mOutBufPos; 279 int mInOutBuf; 280 }; 281 282 283 class AudioStreamInALSA : public AudioStreamIn, public BufferProvider, public RefBase 284 { 285 286 public: 287 AudioStreamInALSA(); 288 virtual ~AudioStreamInALSA(); 289 status_t set(AudioHardware* hw, 290 uint32_t devices, 291 int *pFormat, 292 uint32_t *pChannels, 293 uint32_t *pRate, 294 AudioSystem::audio_in_acoustics acoustics); 295 virtual size_t bufferSize() const { return mBufferSize; } 296 virtual uint32_t channels() const { return mChannels; } 297 virtual int format() const { return AUDIO_HW_IN_FORMAT; } 298 virtual uint32_t sampleRate() const { return mSampleRate; } 299 virtual status_t setGain(float gain) { return INVALID_OPERATION; } 300 virtual ssize_t read(void* buffer, ssize_t bytes); 301 virtual status_t dump(int fd, const Vector<String16>& args); 302 virtual status_t standby(); 303 bool checkStandby(); 304 virtual status_t setParameters(const String8& keyValuePairs); 305 virtual String8 getParameters(const String8& keys); 306 virtual unsigned int getInputFramesLost() const { return 0; } 307 uint32_t device() { return mDevices; } 308 void doStandby_l(); 309 void close_l(); 310 status_t open_l(); 311 int standbyCnt() { return mStandbyCnt; } 312 313 static size_t getBufferSize(uint32_t sampleRate, int channelCount); 314 315 // BufferProvider 316 virtual status_t getNextBuffer(BufferProvider::Buffer* buffer); 317 virtual void releaseBuffer(BufferProvider::Buffer* buffer); 318 319 void lock() { mLock.lock(); } 320 void unlock() { mLock.unlock(); } 321 322 private: 323 Mutex mLock; 324 AudioHardware* mHardware; 325 struct pcm *mPcm; 326 struct mixer *mMixer; 327 struct mixer_ctl *mRouteCtl; 328 const char *next_route; 329 bool mStandby; 330 uint32_t mDevices; 331 uint32_t mChannels; 332 uint32_t mChannelCount; 333 uint32_t mSampleRate; 334 size_t mBufferSize; 335 DownSampler *mDownSampler; 336 status_t mReadStatus; 337 size_t mInPcmInBuf; 338 int16_t *mPcmIn; 339 // trace driver operations for dump 340 int mDriverOp; 341 int mStandbyCnt; 342 }; 343 344 }; 345 346 }; // namespace android 347 348 #endif 349