cts_audio work: initial code
- volume calibration and THD test case work tuned.
- 59 unit tests pass
- local audio playback / recording works : uses tinyalsa
- host to device ptorocol in host side implemented / tested (with loopback)
- device side recording / playback works for test cases / test_io.xml
- python processing baseline added.
- spectrum algorithm implementated: calculate Transfer Function of device
  over host and check if amplitudes are within margain. Needs parameter tuning
- spectrum test needs some improvements due to the non-flat response from
  ref microphone.

Change-Id: I5288dec42f272260f30f1ace1374d365e31d1664
diff --git a/suite/audio_quality/lib/include/audio/AudioLocal.h b/suite/audio_quality/lib/include/audio/AudioLocal.h
new file mode 100644
index 0000000..a263528
--- /dev/null
+++ b/suite/audio_quality/lib/include/audio/AudioLocal.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+
+#ifndef CTSAUDIO_AUDIOLOCAL_H
+#define CTSAUDIO_AUDIOLOCAL_H
+
+#include <utils/StrongPointer.h>
+#include <utils/threads.h>
+
+#include <Semaphore.h>
+
+#include "AudioHardware.h"
+
+class Buffer;
+
+/**
+ * Basic API for playback and record
+ */
+class AudioLocal: public android::Thread, public AudioHardware {
+public:
+
+    virtual bool prepare(AudioHardware::SamplingRate samplingRate, int gain,
+            int mode = AudioHardware::EModeVoice);
+    virtual bool startPlaybackOrRecord(android::sp<Buffer>& buffer, int numberRepetition = 1);
+    virtual bool waitForCompletion();
+    virtual void stopPlaybackOrRecord();
+
+    virtual ~AudioLocal();
+protected:
+    AudioLocal();
+
+    virtual bool doPrepare(AudioHardware::SamplingRate, int samplesInOneGo) = 0;
+    virtual bool doPlaybackOrRecord(android::sp<Buffer>& buffer) = 0;
+    virtual void doStop() = 0;
+    virtual void releaseHw() {};
+
+private:
+
+
+    bool threadLoop();
+
+    enum AudioCommand{
+        ECmNone = 0,
+        ECmInitialize,
+        ECmRun,
+        ECmStop,
+        ECmThreadStop // terminate the thread
+    };
+
+    bool issueCommandAndWaitForCompletion(AudioCommand command);
+
+protected:
+
+private:
+    // only one command at a time.
+    // Thus, all parameters can be stored here.
+    AudioHardware::SamplingRate mSamplingRate;
+
+    android::sp<Buffer> mBuffer;
+    int mNumberRepetition;
+    int mCurrentRepeat;
+
+    enum AudioState{
+        EStNone,
+        EStCreated,
+        EStInitialized,
+        EStRunning  // playing or recording
+    };
+    volatile AudioState mState;
+    volatile AudioCommand mCurrentCommand;
+
+
+    static const int COMMAND_WAIT_TIME_MSEC = 4000;
+
+    Semaphore mClientCommandWait;
+    Semaphore mClientCompletionWait;
+    Semaphore mAudioThreadWait;
+
+    bool mCommandResult;
+    bool mCompletionResult;
+};
+
+#endif // CTSAUDIO_AUDIOLOCAL_H