• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ** Copyright 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_POST_PROCESSOR_H
18 #define ANDROID_AUDIO_POST_PROCESSOR_H
19 #ifdef USE_PROPRIETARY_AUDIO_EXTENSIONS
20 
21 #include <utils/threads.h>
22 
23 extern "C" {
24 #include "cto_audio_mm.h"
25 }
26 #include "mot_acoustics.h"
27 
28 namespace android_audio_legacy {
29     using android::Mutex;
30     using android::AutoMutex;
31     using android::Condition;
32     using android::Thread;
33     using android::sp;
34 
35 class AudioPostProcessor
36 {
37 public:
38                         AudioPostProcessor();
39                         ~AudioPostProcessor();
40             void        setPlayAudioRate(int rate);
41             void        setAudioDev(struct cpcap_audio_stream *outDev,
42                                     struct cpcap_audio_stream *inDev,
43                                     bool is_bt, bool is_bt_ec, bool is_spdif);
44             void        doMmProcessing(void * buffer, int numSamples);
45             int         getEcnsRate(void);
46 
47             // voice processing IDs for enableEcns()
48             enum {
49                 AEC = 0x1,   // AEC is enabled
50                 NS = 0x2     // NS is enabled
51             };
52             // enable or disable voice processing according to bit field passed
53             void        enableEcns(int value);
isEcnsEnabled(void)54             bool        isEcnsEnabled(void) { return (mEcnsEnabled != 0); }
isEcEnabled(void)55             bool        isEcEnabled(void) { return !!(mEcnsEnabled & AEC); }
56 
57             int         writeDownlinkEcns(int fd, void * buffer,
58                                           bool stereo, int bytes, Mutex * fdLockp);
59             int         read(int fd, void * buffer, int bytes, int rate);
60             int         applyUplinkEcns(void * buffer, int bytes, int rate);
61 
62 private:
63             void        configMmAudio(void);
64             uint32_t    convOutDevToCTO(uint32_t outDev);
65             uint32_t    convRateToCto(uint32_t rate);
66 
67             void        initEcns(int rate, int bytes);
68             void        stopEcns(void);
69             void        cleanupEcns(void);
70             void        ecnsLogToRam(int bytes);
71             void        ecnsLogToFile(void);
72             int         read_dock_prop(char const *path);
73 
74         // CTO Multimedia Audio Processing storage buffers
75             int16_t     mPcmLoggingBuf[((CTO_AUDIO_MM_DATALOGGING_BUFFER_BLOCK_BYTESIZE)/2)];
76             uint32_t    mNoiseEst[((CTO_AUDIO_MM_NOISE_EST_BLOCK_BYTESIZE)/4)];
77             uint16_t    mRuntimeParam[((CTO_AUDIO_MM_RUNTIME_PARAM_BYTESIZE)/2)];
78             uint16_t    mStaticMem[((CTO_AUDIO_MM_STATICMEM_BLOCK_BYTESIZE)/2)];
79             uint16_t    mScratchMem[((CTO_AUDIO_MM_SCRATCHMEM_BLOCK_BYTESIZE)/2)];
80             CTO_AUDIO_MM_ENV_VAR mAudioMmEnvVar;
81             Mutex       mMmLock;
82 
83         // EC/NS configuration etc.
84             Mutex       mEcnsBufLock;
85             Condition   mEcnsBufCond;  // Signal to unblock write thread
86             int         mEcnsEnabled; // Enabled by libaudio
87             bool        mEcnsRunning; // ECNS module init done by read thread
88             int         mEcnsRate;
89             void *      mEcnsScratchBuf;  // holding cell for downlink speech "consumed".
90             int         mEcnsScratchBufSize;
91             void *      mEcnsOutBuf;      // buffer from downlink "write()"
92             int         mEcnsOutBufSize;
93             int         mEcnsOutBufReadOffset;
94             int         mEcnsOutFd;       // fd pointing to output driver
95             Mutex *     mEcnsOutFdLockp;
96             CTO_AUDIO_USECASES_CTRL mEcnsMode;
97             char *      mLogBuf[15];
98             int         mLogOffset;
99             int         mLogSize;
100             int         mLogNumPoints;
101             uint16_t    mLogPoint[15];
102             int16_t *   mEcnsDlBuf;
103             int         mEcnsDlBufSize;
104             bool        mEcnsOutStereo;
105 
106         // EC/NS Module memory
107             T_MOT_MEM_BLOCKS mMemBlocks;
108             T_MOT_CTRL  mEcnsCtrl;
109             uint16_t    mStaticMemory_1[API_MOT_STATIC_MEM_WORD16_SIZE];
110             uint16_t    mMotDatalog[API_MOT_DATALOGGING_MEM_WORD16_SIZE];
111             uint16_t    mParamTable[AUDIO_PROFILE_PARAMETER_BLOCK_WORD16_SIZE*CTO_AUDIO_USECASE_TOTAL_NUMBER];
112 
113         // ECNS Thread
114             class EcnsThread : public Thread {
115 public:
116                         EcnsThread();
117                         ~EcnsThread();
118             int         readData(int fd, void * buffer, int bytes, int rate,
119                                  AudioPostProcessor * pp);
broadcastReadCond()120             void        broadcastReadCond() { mEcnsReadCond.broadcast(); }
121 
122 private:
123             bool        threadLoop();
124             Mutex       mEcnsReadLock;
125             Condition   mEcnsReadCond;  // Signal to unblock read thread
126             AudioPostProcessor * mProcessor;
127             void *      mClientBuf;
128             int         mReadSize;
129             int16_t *   mReadBuf;
130             int         mFd;
131             int         mRate;
132             bool        mIsRunning;
133             };
134             sp <EcnsThread> mEcnsThread;
135 };
136 } // namespace android
137 
138 #endif // USE_PROPRIETARY_AUDIO_EXTENSIONS
139 #endif // ANDROID_AUDIO_POST_PROCESSOR_H
140