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