1f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin/*
2f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
3f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Copyright 2007, The Android Open Source Project
4f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
5f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Licensed under the Apache License, Version 2.0 (the "License");
6f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** you may not use this file except in compliance with the License.
7f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** You may obtain a copy of the License at
8f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
9f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**     http://www.apache.org/licenses/LICENSE-2.0
10f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
11f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Unless required by applicable law or agreed to in writing, software
12f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** distributed under the License is distributed on an "AS IS" BASIS,
13f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** See the License for the specific language governing permissions and
15f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** limitations under the License.
16f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin*/
17f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
18f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#ifndef ANDROID_AUDIO_HARDWARE_GENERIC_H
19f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#define ANDROID_AUDIO_HARDWARE_GENERIC_H
20f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
21f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <stdint.h>
22f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <sys/types.h>
23f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
24f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <utils/threads.h>
25f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
26e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware_legacy/AudioSystemLegacy.h>
27f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <hardware_legacy/AudioHardwareBase.h>
28f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
29e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy {
30e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    using android::Mutex;
31e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    using android::AutoMutex;
32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass AudioHardwareGeneric;
36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass AudioStreamOutGeneric : public AudioStreamOut {
38f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinpublic:
39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                        AudioStreamOutGeneric() : mAudioHardware(0), mFd(-1) {}
40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual             ~AudioStreamOutGeneric();
41f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    set(
43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            AudioHardwareGeneric *hw,
44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int mFd,
45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t devices,
46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int *pFormat,
47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *pChannels,
48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *pRate);
49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual uint32_t    sampleRate() const { return 44100; }
51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual size_t      bufferSize() const { return 4096; }
52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual uint32_t    channels() const { return AudioSystem::CHANNEL_OUT_STEREO; }
53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual int         format() const { return AudioSystem::PCM_16_BIT; }
54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual uint32_t    latency() const { return 20; }
55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setVolume(float left, float right) { return INVALID_OPERATION; }
56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual ssize_t     write(const void* buffer, size_t bytes);
57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    standby();
58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    dump(int fd, const Vector<String16>& args);
59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setParameters(const String8& keyValuePairs);
60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual String8     getParameters(const String8& keys);
61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    getRenderPosition(uint32_t *dspFrames);
62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprivate:
64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioHardwareGeneric *mAudioHardware;
65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Mutex   mLock;
66f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int     mFd;
67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t mDevice;
68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass AudioStreamInGeneric : public AudioStreamIn {
71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinpublic:
72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                        AudioStreamInGeneric() : mAudioHardware(0), mFd(-1) {}
73f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual             ~AudioStreamInGeneric();
74f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
75f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    set(
76f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            AudioHardwareGeneric *hw,
77f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int mFd,
78f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t devices,
79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int *pFormat,
80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *pChannels,
81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *pRate,
82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            AudioSystem::audio_in_acoustics acoustics);
83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual uint32_t    sampleRate() const { return 8000; }
85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual size_t      bufferSize() const { return 320; }
86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual uint32_t    channels() const { return AudioSystem::CHANNEL_IN_MONO; }
87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual int         format() const { return AudioSystem::PCM_16_BIT; }
88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setGain(float gain) { return INVALID_OPERATION; }
89f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual ssize_t     read(void* buffer, ssize_t bytes);
90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    dump(int fd, const Vector<String16>& args);
91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    standby() { return NO_ERROR; }
92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setParameters(const String8& keyValuePairs);
93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual String8     getParameters(const String8& keys);
94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual unsigned int  getInputFramesLost() const { return 0; }
95a527ffd3c2ce72048a8fae51cd399024af4439b9Richard Fitzgerald    virtual status_t addAudioEffect(effect_handle_t effect) { return NO_ERROR; }
96a527ffd3c2ce72048a8fae51cd399024af4439b9Richard Fitzgerald    virtual status_t removeAudioEffect(effect_handle_t effect) { return NO_ERROR; }
97f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprivate:
99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioHardwareGeneric *mAudioHardware;
100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Mutex   mLock;
101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int     mFd;
102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t mDevice;
103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass AudioHardwareGeneric : public AudioHardwareBase
107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinpublic:
109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                        AudioHardwareGeneric();
110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual             ~AudioHardwareGeneric();
111f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    initCheck();
112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setVoiceVolume(float volume);
113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMasterVolume(float volume);
114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
115f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // mic mute
116f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMicMute(bool state);
117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    getMicMute(bool* state);
118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // create I/O streams
120f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamOut* openOutputStream(
121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t devices,
122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int *format=0,
123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *channels=0,
124f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *sampleRate=0,
125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            status_t *status=0);
126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeOutputStream(AudioStreamOut* out);
127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamIn* openInputStream(
129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t devices,
130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            int *format,
131f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *channels,
132f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            uint32_t *sampleRate,
133f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            status_t *status,
134f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            AudioSystem::audio_in_acoustics acoustics);
135f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeInputStream(AudioStreamIn* in);
136f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            void            closeOutputStream(AudioStreamOutGeneric* out);
138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            void            closeInputStream(AudioStreamInGeneric* in);
139f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprotected:
140f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t        dump(int fd, const Vector<String16>& args);
141f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
142f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprivate:
143f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    status_t                dumpInternals(int fd, const Vector<String16>& args);
144f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
145f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Mutex                   mLock;
146f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamOutGeneric   *mOutput;
147f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamInGeneric    *mInput;
148f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int                     mFd;
149f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    bool                    mMicMute;
150f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
151f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
152f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
153f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
154f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
155f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
156f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif // ANDROID_AUDIO_HARDWARE_GENERIC_H
157