1f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin/*
2f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * Copyright (C) 2008 The Android Open Source Project
3f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *
4f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License");
5f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * you may not use this file except in compliance with the License.
6f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * You may obtain a copy of the License at
7f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *
8f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *      http://www.apache.org/licenses/LICENSE-2.0
9f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *
10f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * Unless required by applicable law or agreed to in writing, software
11f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS,
12f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * See the License for the specific language governing permissions and
14f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin * limitations under the License.
15f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin */
16f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
17f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#ifndef A2DP_AUDIO_HARDWARE_H
18f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#define A2DP_AUDIO_HARDWARE_H
19f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
20f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <stdint.h>
21f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <sys/types.h>
22f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
23f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <utils/threads.h>
24f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
25f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <hardware_legacy/AudioHardwareBase.h>
26f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
27f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
28e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy {
29e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    using android::Mutex;
30f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
31f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass A2dpAudioInterface : public AudioHardwareBase
32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    class A2dpAudioStreamOut;
34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinpublic:
36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                        A2dpAudioInterface(AudioHardwareInterface* hw);
37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual             ~A2dpAudioInterface();
38f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    initCheck();
39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setVoiceVolume(float volume);
41f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMasterVolume(float volume);
42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMode(int mode);
44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // mic mute
46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMicMute(bool state);
47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    getMicMute(bool* state);
48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setParameters(const String8& keyValuePairs);
50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual String8     getParameters(const String8& keys);
51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // create I/O streams
55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamOut* openOutputStream(
56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t devices,
57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *format=0,
58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *channels=0,
59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *sampleRate=0,
60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                status_t *status=0);
61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeOutputStream(AudioStreamOut* out);
62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamIn* openInputStream(
64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t devices,
65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *format,
66f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *channels,
67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *sampleRate,
68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                status_t *status,
69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                AudioSystem::audio_in_acoustics acoustics);
70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeInputStream(AudioStreamIn* in);
71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin//    static AudioHardwareInterface* createA2dpInterface();
72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
73f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprotected:
74f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    dump(int fd, const Vector<String16>& args);
75f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
76f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprivate:
77f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    class A2dpAudioStreamOut : public AudioStreamOut {
78f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    public:
79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                            A2dpAudioStreamOut();
80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual             ~A2dpAudioStreamOut();
81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    set(uint32_t device,
82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *pFormat,
83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *pChannels,
84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *pRate);
85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    sampleRate() const { return 44100; }
86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        // SBC codec wants a multiple of 512
87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual size_t      bufferSize() const { return 512 * 20; }
88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    channels() const { return AudioSystem::CHANNEL_OUT_STEREO; }
89f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual int         format() const { return AudioSystem::PCM_16_BIT; }
90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    latency() const { return ((1000*bufferSize())/frameSize())/sampleRate() + 200; }
91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    setVolume(float left, float right) { return INVALID_OPERATION; }
92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual ssize_t     write(const void* buffer, size_t bytes);
93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    standby();
94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    dump(int fd, const Vector<String16>& args);
95f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    setParameters(const String8& keyValuePairs);
96f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual String8     getParameters(const String8& keys);
97f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    getRenderPosition(uint32_t *dspFrames);
98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    private:
100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        friend class A2dpAudioInterface;
101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    init();
102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    close();
103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    close_l();
104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setAddress(const char* address);
105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setBluetoothEnabled(bool enabled);
106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setSuspended(bool onOff);
107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    standby_l();
108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    private:
110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mFd;
111f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mStandby;
112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mStartCount;
113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mRetryCount;
114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                char        mA2dpAddress[20];
115f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                void*       mData;
116f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                Mutex       mLock;
117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mBluetoothEnabled;
118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                uint32_t    mDevice;
119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mClosing;
120f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mSuspended;
121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                nsecs_t     mLastWriteTime;
122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                uint32_t    mBufferDurationUs;
123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    };
124f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    friend class A2dpAudioStreamOut;
126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    A2dpAudioStreamOut*     mOutput;
128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioHardwareInterface  *mHardwareInterface;
129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    char        mA2dpAddress[20];
130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    bool        mBluetoothEnabled;
131f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    bool        mSuspended;
132f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
133f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
134f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
135f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
136f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
139f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif // A2DP_AUDIO_HARDWARE_H
140