Home | History | Annotate | Download | only in libaudio2
      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