A2dpAudioInterface.h revision f01215993dda68b6b52111d754bd0c7c2d5bcfa3
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
28f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinnamespace android {
29f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
30f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinclass A2dpAudioInterface : public AudioHardwareBase
31f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    class A2dpAudioStreamOut;
33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinpublic:
35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                        A2dpAudioInterface(AudioHardwareInterface* hw);
36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual             ~A2dpAudioInterface();
37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    initCheck();
38f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setVoiceVolume(float volume);
40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMasterVolume(float volume);
41f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMode(int mode);
43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // mic mute
45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setMicMute(bool state);
46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    getMicMute(bool* state);
47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    setParameters(const String8& keyValuePairs);
49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual String8     getParameters(const String8& keys);
50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    // create I/O streams
54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamOut* openOutputStream(
55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t devices,
56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *format=0,
57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *channels=0,
58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *sampleRate=0,
59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                status_t *status=0);
60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeOutputStream(AudioStreamOut* out);
61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual AudioStreamIn* openInputStream(
63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t devices,
64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *format,
65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *channels,
66f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *sampleRate,
67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                status_t *status,
68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                AudioSystem::audio_in_acoustics acoustics);
69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual    void        closeInputStream(AudioStreamIn* in);
70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin//    static AudioHardwareInterface* createA2dpInterface();
71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprotected:
73f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    virtual status_t    dump(int fd, const Vector<String16>& args);
74f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
75f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinprivate:
76f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    class A2dpAudioStreamOut : public AudioStreamOut {
77f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    public:
78f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                            A2dpAudioStreamOut();
79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual             ~A2dpAudioStreamOut();
80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    set(uint32_t device,
81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                int *pFormat,
82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *pChannels,
83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                uint32_t *pRate);
84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    sampleRate() const { return 44100; }
85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        // SBC codec wants a multiple of 512
86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual size_t      bufferSize() const { return 512 * 20; }
87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    channels() const { return AudioSystem::CHANNEL_OUT_STEREO; }
88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual int         format() const { return AudioSystem::PCM_16_BIT; }
89f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual uint32_t    latency() const { return ((1000*bufferSize())/frameSize())/sampleRate() + 200; }
90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    setVolume(float left, float right) { return INVALID_OPERATION; }
91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual ssize_t     write(const void* buffer, size_t bytes);
92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    standby();
93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    dump(int fd, const Vector<String16>& args);
94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    setParameters(const String8& keyValuePairs);
95f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual String8     getParameters(const String8& keys);
96f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        virtual status_t    getRenderPosition(uint32_t *dspFrames);
97f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    private:
99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        friend class A2dpAudioInterface;
100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    init();
101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    close();
102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    close_l();
103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setAddress(const char* address);
104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setBluetoothEnabled(bool enabled);
105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    setSuspended(bool onOff);
106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status_t    standby_l();
107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    private:
109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mFd;
110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mStandby;
111f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mStartCount;
112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                int         mRetryCount;
113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                char        mA2dpAddress[20];
114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                void*       mData;
115f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                Mutex       mLock;
116f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mBluetoothEnabled;
117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                uint32_t    mDevice;
118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mClosing;
119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                bool        mSuspended;
120f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                nsecs_t     mLastWriteTime;
121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                uint32_t    mBufferDurationUs;
122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    };
123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
124f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    friend class A2dpAudioStreamOut;
125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    A2dpAudioStreamOut*     mOutput;
127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioHardwareInterface  *mHardwareInterface;
128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    char        mA2dpAddress[20];
129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    bool        mBluetoothEnabled;
130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    bool        mSuspended;
131f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
132f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
133f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
134f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
135f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
136f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif // A2DP_AUDIO_HARDWARE_H
139