1 /* 2 ** Copyright 2008-2010, 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 #include "AudioPostProcessor.h" 28 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 29 extern "C" { 30 #include "rate_conv.h" 31 } 32 #endif 33 34 namespace android_audio_legacy { 35 using android::AutoMutex; 36 using android::Mutex; 37 using android::SortedVector; 38 39 #include <linux/cpcap_audio.h> 40 #include <linux/tegra_audio.h> 41 42 #define AUDIO_HW_OUT_SAMPLERATE 44100 43 #define AUDIO_HW_NUM_OUT_BUF 2 44 #define AUDIO_HW_OUT_LATENCY_MS 0 45 46 // FIXME: this is a workaround for issue 3387419 with impact on latency 47 // to be removed when root cause is fixed 48 #define AUDIO_HW_NUM_OUT_BUF_LONG 4 49 50 #define AUDIO_HW_IN_SAMPLERATE 11025 // Default audio input sample rate 51 #define AUDIO_HW_IN_CHANNELS (AudioSystem::CHANNEL_IN_MONO) // Default audio input channel mask 52 #define AUDIO_HW_IN_BUFFERSIZE (4096) // Default audio input buffer size 53 #define AUDIO_HW_IN_FORMAT (AudioSystem::PCM_16_BIT) // Default audio input sample format 54 55 enum { 56 AUDIO_HW_GAIN_SPKR_GAIN = 0, 57 AUDIO_HW_GAIN_MIC_GAIN, 58 AUDIO_HW_GAIN_NUM_DIRECTIONS 59 }; 60 enum { 61 AUDIO_HW_GAIN_USECASE_VOICE= 0, 62 AUDIO_HW_GAIN_USECASE_MM, 63 AUDIO_HW_GAIN_USECASE_VOICE_REC, 64 AUDIO_HW_GAIN_NUM_USECASES 65 }; 66 enum { 67 AUDIO_HW_GAIN_EARPIECE = 0, 68 AUDIO_HW_GAIN_SPEAKERPHONE, 69 AUDIO_HW_GAIN_HEADSET_W_MIC, 70 AUDIO_HW_GAIN_MONO_HEADSET, 71 AUDIO_HW_GAIN_HEADSET_NO_MIC, 72 AUDIO_HW_GAIN_EMU_DEVICE, 73 AUDIO_HW_GAIN_RSVD1, 74 AUDIO_HW_GAIN_RSVD2, 75 AUDIO_HW_GAIN_RSVD3, 76 AUDIO_HW_GAIN_RSVD4, 77 AUDIO_HW_GAIN_RSVD5, 78 AUDIO_HW_GAIN_NUM_PATHS 79 }; 80 81 enum input_state { 82 AUDIO_STREAM_IDLE, 83 AUDIO_STREAM_CONFIG_REQ, 84 AUDIO_STREAM_NEW_RATE_REQ, 85 AUDIO_STREAM_CONFIGURED 86 }; 87 88 class AudioHardware : public AudioHardwareBase 89 { 90 class AudioStreamOutTegra; 91 class AudioStreamInTegra; 92 class AudioStreamSrc; 93 94 public: 95 // AudioHardwareInterface 96 AudioHardware(); 97 virtual ~AudioHardware(); 98 virtual status_t initCheck(); 99 100 virtual status_t setVoiceVolume(float volume); 101 virtual status_t setMasterVolume(float volume); 102 103 virtual status_t setMode(int mode); 104 105 // mic mute 106 virtual status_t setMicMute(bool state); 107 virtual status_t getMicMute(bool* state); 108 109 virtual status_t setParameters(const String8& keyValuePairs); 110 virtual String8 getParameters(const String8& keys); 111 112 // create I/O streams 113 virtual AudioStreamOut* openOutputStream( 114 uint32_t devices, 115 int *format=0, 116 uint32_t *channels=0, 117 uint32_t *sampleRate=0, 118 status_t *status=0); 119 120 virtual AudioStreamIn* openInputStream( 121 122 uint32_t devices, 123 int *format, 124 uint32_t *channels, 125 uint32_t *sampleRate, 126 status_t *status, 127 AudioSystem::audio_in_acoustics acoustics); 128 129 virtual void closeOutputStream(AudioStreamOut* out); 130 virtual void closeInputStream(AudioStreamIn* in); 131 132 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); 133 // AudioHardwareBase provides default implementation 134 //virtual status_t dumpState(int fd, const Vector<String16>& args); 135 136 // added by AudioHardware 137 status_t init(); 138 139 // voice processing IDs for mEcnsRequested and mEcnsEnabled 140 enum { 141 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 142 PREPROC_AEC = AudioPostProcessor::AEC, // AEC is enabled 143 PREPROC_NS = AudioPostProcessor::NS, // NS is enabled 144 #else 145 PREPROC_AEC = 0x1, // AEC is enabled 146 PREPROC_NS = 0x2, // NS is enabled 147 #endif 148 }; 149 150 void setEcnsRequested_l(int ecns, bool enabled); 151 bool isEcRequested() { return !!(mEcnsRequested & PREPROC_AEC); } 152 protected: 153 // AudioHardwareBase provides default implementation 154 //virtual bool isModeInCall(int mode); 155 //virtual bool isInCall(); 156 157 // AudioHardwareInterface 158 virtual status_t dump(int fd, const Vector<String16>& args); 159 160 // added by AudioHardware 161 int getActiveInputRate(); 162 163 164 private: 165 166 status_t dumpInternals(int fd, const Vector<String16>& args); 167 uint32_t getInputSampleRate(uint32_t sampleRate); 168 status_t doStandby(int stop_fd, bool output, bool enable); 169 status_t doRouting_l(); 170 status_t doRouting(); 171 status_t setVolume_l(float v, int usecase); 172 uint8_t getGain(int direction, int usecase); 173 void readHwGainFile(); 174 175 AudioStreamInTegra* getActiveInput_l(); 176 status_t setMicMute_l(bool state); 177 178 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 179 class AudioStreamSrc { 180 public: 181 AudioStreamSrc(); 182 ~AudioStreamSrc(); 183 inline int inRate() {return mSrcInRate;}; 184 inline int outRate() {return mSrcOutRate;}; 185 inline bool initted() {return mSrcInitted;}; 186 void init(int inRate, int outRate); 187 inline void deinit() {mSrcInitted = false;}; 188 SRC_IO_T mIoData; 189 inline void srcConvert() { rate_convert(&mIoData, &mSrcObj, 0x0800); }; 190 private: 191 SRC_OBJ_T mSrcObj; 192 char * mSrcBuffer; 193 SRC_INIT_T mSrcInit; 194 int mSrcInRate; 195 int mSrcOutRate; 196 bool mSrcInitted; 197 }; 198 #endif 199 200 class AudioStreamOutTegra : public AudioStreamOut { 201 public: 202 AudioStreamOutTegra(); 203 virtual ~AudioStreamOutTegra(); 204 status_t init(); 205 status_t initCheck(); 206 void setDriver_l(bool speaker, bool bluetooth, bool spdif, int sampleRate); 207 status_t set(AudioHardware* mHardware, 208 uint32_t devices, 209 int *pFormat, 210 uint32_t *pChannels, 211 uint32_t *pRate); 212 virtual uint32_t sampleRate() const { return AUDIO_HW_OUT_SAMPLERATE; } 213 // must be 32-bit aligned - driver only seems to like 4800 214 virtual size_t bufferSize() const { return 4096; } 215 virtual uint32_t channels() const { return AudioSystem::CHANNEL_OUT_STEREO; } 216 virtual int format() const { return AudioSystem::PCM_16_BIT; } 217 virtual uint32_t latency() const { return (1000*AUDIO_HW_NUM_OUT_BUF_LONG*(bufferSize()/frameSize()))/sampleRate()+AUDIO_HW_OUT_LATENCY_MS; } 218 virtual status_t setVolume(float left, float right) { return INVALID_OPERATION; } 219 virtual ssize_t write(const void* buffer, size_t bytes); 220 void flush(); 221 void flush_l(); 222 virtual status_t standby(); 223 status_t online_l(); 224 virtual status_t dump(int fd, const Vector<String16>& args); 225 bool getStandby(); 226 virtual status_t setParameters(const String8& keyValuePairs); 227 virtual String8 getParameters(const String8& keys); 228 uint32_t devices() { return mDevices; } 229 virtual status_t getRenderPosition(uint32_t *dspFrames); 230 void lock() { mSleepReq = true; mLock.lock(); mSleepReq = false; } 231 void unlock() { mLock.unlock(); } 232 bool isLocked() { return mLocked; } 233 void setNumBufs(int numBufs); 234 void lockFd() { mFdLock.lock(); } 235 void unlockFd() { mFdLock.unlock(); } 236 237 int mBtFdIoCtl; 238 239 private: 240 AudioHardware* mHardware; 241 Mutex mLock; 242 int mFd; 243 int mFdCtl; 244 int mBtFd; 245 int mBtFdCtl; 246 int mSpdifFd; 247 int mSpdifFdCtl; 248 int mStartCount; 249 int mRetryCount; 250 uint32_t mDevices; 251 Mutex mFdLock; 252 bool mIsSpkrEnabled; 253 bool mIsBtEnabled; 254 bool mIsSpdifEnabled; 255 bool mIsSpkrEnabledReq; 256 bool mIsBtEnabledReq; 257 bool mIsSpdifEnabledReq; 258 int16_t mSpareSample; 259 bool mHaveSpareSample; 260 int mState; 261 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 262 AudioStreamSrc mSrc; 263 #endif 264 bool mLocked; // setDriver() doesn't have to lock if true 265 int mDriverRate; 266 bool mInit; 267 bool mSleepReq; 268 }; 269 270 class AudioStreamInTegra : public AudioStreamIn { 271 public: 272 AudioStreamInTegra(); 273 virtual ~AudioStreamInTegra(); 274 status_t set(AudioHardware* mHardware, 275 uint32_t devices, 276 int *pFormat, 277 uint32_t *pChannels, 278 uint32_t *pRate, 279 AudioSystem::audio_in_acoustics acoustics); 280 virtual size_t bufferSize() const { return mBufferSize; } 281 virtual uint32_t channels() const { return mChannels; } 282 virtual int format() const { return mFormat; } 283 virtual uint32_t sampleRate() const { return mSampleRate; } 284 virtual status_t setGain(float gain) { return INVALID_OPERATION; } 285 virtual ssize_t read(void* buffer, ssize_t bytes); 286 virtual status_t dump(int fd, const Vector<String16>& args); 287 virtual status_t standby(); 288 virtual status_t online_l(); 289 bool getStandby() const; 290 virtual status_t setParameters(const String8& keyValuePairs); 291 virtual String8 getParameters(const String8& keys); 292 virtual unsigned int getInputFramesLost() const; 293 virtual status_t addAudioEffect(effect_handle_t effect); 294 virtual status_t removeAudioEffect(effect_handle_t effect); 295 296 uint32_t devices() { return mDevices; } 297 void setDriver_l(bool mic, bool bluetooth, int sampleRate); 298 int source() const { return mSource; } 299 void lock() { mSleepReq = true; mLock.lock(); mSleepReq = false; } 300 void unlock() { mLock.unlock(); } 301 bool isLocked() { return mLocked; } 302 void stop_l(); 303 void lockFd() { mFdLock.lock(); } 304 void unlockFd() { mFdLock.unlock(); } 305 306 private: 307 void reopenReconfigDriver(); 308 void updateEcnsRequested(effect_handle_t effect, bool enabled); 309 310 AudioHardware* mHardware; 311 Mutex mLock; 312 int mFd; 313 int mFdCtl; 314 int mState; 315 int mRetryCount; 316 int mFormat; 317 uint32_t mChannels; 318 uint32_t mSampleRate; 319 size_t mBufferSize; 320 AudioSystem::audio_in_acoustics mAcoustics; 321 uint32_t mDevices; 322 bool mIsMicEnabled; 323 bool mIsBtEnabled; 324 int mSource; 325 // 20 millisecond scratch buffer 326 int16_t mInScratch[48000/50]; 327 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 328 AudioStreamSrc mSrc; 329 #endif 330 bool mLocked; // setDriver() doesn't have to lock if true 331 mutable uint32_t mTotalBuffersRead; 332 mutable nsecs_t mStartTimeNs; 333 int mDriverRate; 334 mutable Mutex mFramesLock; 335 Mutex mFdLock; 336 bool mSleepReq; 337 int mEcnsRequested; // bit field indicating if AEC and/or NS are requested 338 }; 339 340 static const uint32_t inputSamplingRates[]; 341 bool mInit; 342 bool mMicMute; 343 bool mBluetoothNrec; 344 uint32_t mBluetoothId; 345 AudioStreamOutTegra* mOutput; 346 SortedVector <AudioStreamInTegra*> mInputs; 347 348 struct cpcap_audio_stream mCurOutDevice; 349 struct cpcap_audio_stream mCurInDevice; 350 351 friend class AudioStreamInTegra; 352 Mutex mLock; 353 354 int mCpcapCtlFd; 355 int mHwOutRate; 356 int mHwInRate; 357 float mMasterVol; 358 float mVoiceVol; 359 uint8_t mCpcapGain[AUDIO_HW_GAIN_NUM_DIRECTIONS] 360 [AUDIO_HW_GAIN_NUM_USECASES] 361 [AUDIO_HW_GAIN_NUM_PATHS]; 362 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS 363 AudioPostProcessor mAudioPP; 364 #endif 365 int mSpkrVolume; 366 int mMicVolume; 367 368 int mEcnsEnabled; // bit field indicating if AEC and/or NS are enabled 369 int mEcnsRequested; // bit field indicating if AEC and/or NS are requested 370 bool mBtScoOn; 371 }; 372 373 // ---------------------------------------------------------------------------- 374 375 }; // namespace android 376 377 #endif // ANDROID_AUDIO_HARDWARE_H 378