165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland/*
265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** Copyright 2008, The Android Open-Source Project
365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland**
465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** Licensed under the Apache License, Version 2.0 (the "License");
565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** you may not use this file except in compliance with the License.
665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** You may obtain a copy of the License at
765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland**
865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland**     http://www.apache.org/licenses/LICENSE-2.0
965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland**
1065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** Unless required by applicable law or agreed to in writing, software
1165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** distributed under the License is distributed on an "AS IS" BASIS,
1265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** See the License for the specific language governing permissions and
1465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland** limitations under the License.
1565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland*/
1665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
1765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#ifndef ANDROID_AUDIO_HARDWARE_H
1865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define ANDROID_AUDIO_HARDWARE_H
1965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
2065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#include <stdint.h>
2165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#include <sys/types.h>
2265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
2365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#include <utils/threads.h>
2465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#include <utils/SortedVector.h>
2565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
2665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#include <hardware_legacy/AudioHardwareBase.h>
2765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
2865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetlandnamespace android {
2965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
3065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define CODEC_TYPE_PCM 0
3165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define PCM_FILL_BUFFER_COUNT 1
3265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_NUM_OUT_BUF 2  // Number of buffers in audio driver for output
3365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
3465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland// TODO: determine actual audio DSP and hardware latency
3565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_OUT_LATENCY_MS 0  // Additionnal latency introduced by audio DSP and hardware in ms
3665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_OUT_SAMPLERATE 44100 // Default audio output sample rate
3765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_OUT_CHANNELS (AudioSystem::CHANNEL_OUT_STEREO) // Default audio output channel mask
3865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_OUT_FORMAT (AudioSystem::PCM_16_BIT)  // Default audio output sample format
3965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_OUT_BUFSZ 4096  // Default audio output buffer size
4065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
4165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#if 0
4265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_IN_SAMPLERATE 8000                 // Default audio input sample rate
4365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_IN_CHANNELS (AudioSystem::CHANNEL_IN_MONO) // Default audio input channel mask
4465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_IN_FORMAT (AudioSystem::PCM_16_BIT)  // Default audio input sample format
4565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define AUDIO_HW_IN_BUFSZ 256  // Default audio input buffer size
4665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
4765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#define VOICE_VOLUME_MAX 5  // Maximum voice volume
4865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#endif
4965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
5065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetlandclass AudioHardware : public  AudioHardwareBase
5165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland{
5265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    class AudioStreamOutQ5V2;
5365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
5465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetlandpublic:
5565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                        AudioHardware();
5665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual             ~AudioHardware();
5765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    initCheck();
5865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
5965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    setVoiceVolume(float volume);
6065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    setMasterVolume(float volume);
6165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
6265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    setMode(int mode);
6365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
6465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    setMicMute(bool state);
6565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    getMicMute(bool* state);
6665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
6765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    setParameters(const String8& keyValuePairs);
6865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual String8     getParameters(const String8& keys);
6965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
7065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual AudioStreamOut* openOutputStream(
7165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t devices,
7265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                int *format=0,
7365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *channels=0,
7465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *sampleRate=0,
7565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                status_t *status=0);
7665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
7765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual AudioStreamIn* openInputStream(
7865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t devices,
7965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                int *format,
8065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *channels,
8165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *sampleRate,
8265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                status_t *status,
8365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                AudioSystem::audio_in_acoustics acoustics);
8465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
8565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual    void        closeOutputStream(AudioStreamOut* out);
8665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual    void        closeInputStream(AudioStreamIn* in);
8765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
8865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
8965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
9065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    void clearCurDevice() { }
9165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
9265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetlandprotected:
9365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    virtual status_t    dump(int fd, const Vector<String16>& args);
9465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
9565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetlandprivate:
9665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
9765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    class AudioStreamOutQ5V2 : public AudioStreamOut {
9865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    public:
9965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                            AudioStreamOutQ5V2();
10065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual             ~AudioStreamOutQ5V2();
10165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                status_t    set(AudioHardware* mHardware,
10265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t devices,
10365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                int *pFormat,
10465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *pChannels,
10565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                                uint32_t *pRate);
10665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual uint32_t    sampleRate() const { return mSampleRate; }
10765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        // must be 32-bit aligned
10865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual size_t      bufferSize() const { return mBufferSize; }
10965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual uint32_t    channels() const { return mChannels; }
11065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual int         format() const { return AUDIO_HW_OUT_FORMAT; }
11165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual uint32_t    latency() const { return (1000*AUDIO_HW_NUM_OUT_BUF*(bufferSize()/frameSize()))/sampleRate()+AUDIO_HW_OUT_LATENCY_MS; }
11265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual status_t    setVolume(float left, float right) { return INVALID_OPERATION; }
11365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual ssize_t     write(const void* buffer, size_t bytes);
11465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual status_t    standby();
11565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual status_t    dump(int fd, const Vector<String16>& args);
11665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                bool        checkStandby();
11765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual status_t    setParameters(const String8& keyValuePairs);
11865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual String8     getParameters(const String8& keys);
11965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                uint32_t    devices() { return mDevices; }
12065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland        virtual status_t    getRenderPosition(uint32_t *dspFrames);
12165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
12265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    private:
12365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                AudioHardware* mHardware;
12465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                int         mFd;
12565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                int         mStartCount;
12665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                int         mRetryCount;
12765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                bool        mStandby;
12865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                uint32_t    mDevices;
12965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                uint32_t    mChannels;
13065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                uint32_t    mSampleRate;
13165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland                size_t      mBufferSize;
13265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland    };
13365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
13465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland            bool        mInit;
13565e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland            bool        mMicMute;
13665e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
13765e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland            AudioStreamOutQ5V2*  mOutput;
13865e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland            Mutex       mLock;
13965e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland};
14065e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
14165e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
14265e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland}; // namespace android
14365e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland
14465e6c49fb6a8872a5e36fa479c4ed9f9fceba43cBrian Swetland#endif // ANDROID_AUDIO_HARDWARE_MSM72XX_H
145