summaryrefslogtreecommitdiffstats
path: root/libaudio/AudioHardware.h
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-06-18 09:47:37 -0700
committerEric Laurent <elaurent@google.com>2011-07-25 14:37:35 -0700
commit40a09525b7c484764c64daa1ca663a314a1b6d31 (patch)
treebd3c889b82ff41979f512967cdcd106e50489c7e /libaudio/AudioHardware.h
parentc593b8893fef34a1ff38d617a4e229447a9466cf (diff)
downloaddevice_samsung_crespo-40a09525b7c484764c64daa1ca663a314a1b6d31.zip
device_samsung_crespo-40a09525b7c484764c64daa1ca663a314a1b6d31.tar.gz
device_samsung_crespo-40a09525b7c484764c64daa1ca663a314a1b6d31.tar.bz2
Audio HAL: added echo reference
Added EchoReference class enabling the input stream to access the audio data written to the output stream and push it as echo reference to the AEC. Also added methods to calculate the echo delay. Moved ReSampler class to a separate source file. Change-Id: I9c3388f39101d567240545eab271eb61c97e7b56
Diffstat (limited to 'libaudio/AudioHardware.h')
-rw-r--r--libaudio/AudioHardware.h80
1 files changed, 29 insertions, 51 deletions
diff --git a/libaudio/AudioHardware.h b/libaudio/AudioHardware.h
index 5eec70e..8824ca5 100644
--- a/libaudio/AudioHardware.h
+++ b/libaudio/AudioHardware.h
@@ -29,7 +29,8 @@
#include "secril-client.h"
-#include "speex/speex_resampler.h"
+#include "ReSampler.h"
+#include "EchoReference.h"
extern "C" {
struct pcm;
@@ -78,6 +79,7 @@ class AudioHardware : public AudioHardwareBase
{
class AudioStreamOutALSA;
class AudioStreamInALSA;
+
public:
// input path names used to translate from input sources to driver paths
@@ -139,6 +141,11 @@ public:
sp <AudioStreamOutALSA> output() { return mOutput; }
+ EchoReference *getEchoReference(audio_format_t format,
+ uint32_t channelCount,
+ uint32_t samplingRate);
+ void releaseEchoReference(EchoReference *reference);
+
protected:
virtual status_t dump(int fd, const Vector<String16>& args);
@@ -180,6 +187,7 @@ private:
int (*setCallClockSync)(HRilClient, SoundClockCondition);
void loadRILD(void);
status_t connectRILDIfRequired(void);
+ EchoReference* mEchoReference;
// trace driver operations for dump
int mDriverOp;
@@ -240,8 +248,13 @@ private:
void lock();
void unlock();
+ void addEchoReference(EchoReference *reference);
+ void removeEchoReference(EchoReference *reference);
+
private:
+ int computeEchoReferenceDelay(size_t frames, struct timespec *echoRefRenderTime);
+
Mutex mLock;
AudioHardware* mHardware;
struct pcm *mPcm;
@@ -257,56 +270,10 @@ private:
int mDriverOp;
int mStandbyCnt;
bool mSleepReq;
+ EchoReference *mEchoReference;
};
- class BufferProvider
- {
- public:
-
- struct Buffer {
- union {
- void* raw;
- short* i16;
- int8_t* i8;
- };
- size_t frameCount;
- };
-
- virtual ~BufferProvider() {}
-
- virtual status_t getNextBuffer(Buffer* buffer) = 0;
- virtual void releaseBuffer(Buffer* buffer) = 0;
- };
-
- class ReSampler {
- public:
- ReSampler(uint32_t inSampleRate,
- uint32_t outSampleRate,
- uint32_t channelCount,
- BufferProvider* provider);
-
- virtual ~ReSampler();
-
- status_t initCheck() { return mStatus; }
- void reset();
- int resample(int16_t* out, size_t *outFrameCount);
-
- private:
- status_t mStatus;
- SpeexResamplerState *mSpeexResampler;
- BufferProvider* mProvider;
- uint32_t mInSampleRate;
- uint32_t mOutSampleRate;
- uint32_t mChannelCount;
- int16_t *mInBuf;
- size_t mInBufSize;
- size_t mFramesIn;
- size_t mFramesRq;
- size_t mFramesNeeded;
- };
-
-
- class AudioStreamInALSA : public AudioStreamIn, public BufferProvider, public RefBase
+ class AudioStreamInALSA : public AudioStreamIn, public ReSampler::BufferProvider, public RefBase
{
public:
@@ -342,8 +309,8 @@ private:
static size_t getBufferSize(uint32_t sampleRate, int channelCount);
// BufferProvider
- virtual status_t getNextBuffer(BufferProvider::Buffer* buffer);
- virtual void releaseBuffer(BufferProvider::Buffer* buffer);
+ virtual status_t getNextBuffer(ReSampler::BufferProvider::Buffer* buffer);
+ virtual void releaseBuffer(ReSampler::BufferProvider::Buffer* buffer);
int prepareLock();
void lock();
@@ -353,6 +320,11 @@ private:
ssize_t readFrames(void* buffer, ssize_t frames);
ssize_t processFrames(void* buffer, ssize_t frames);
+ void updateEchoReference(size_t frames);
+ void pushEchoReference(size_t frames);
+ void updateEchoDelay(size_t frames, struct timespec *echoRefRenderTime);
+ status_t setPreProcessorEchoDelay(effect_handle_t handle, int32_t delayUs);
+ status_t setPreprocessorParam(effect_handle_t handle, effect_param_t *param);
Mutex mLock;
AudioHardware* mHardware;
@@ -378,6 +350,12 @@ private:
int16_t *mProcBuf;
size_t mProcBufSize;
size_t mProcFramesIn;
+ int16_t *mRefBuf;
+ size_t mRefBufSize;
+ size_t mRefFramesIn;
+ EchoReference *mEchoReference;
+ bool mNeedEchoReference;
+ int32_t mEchoDelayUs;
};
};