xref: /aosp_15_r20/hardware/libhardware_legacy/audio/AudioHardwareInterface.cpp (revision 79330504eb3d14022296e3b041867f86289dd52c)
1*79330504STreehugger Robot /*
2*79330504STreehugger Robot **
3*79330504STreehugger Robot ** Copyright 2007, The Android Open Source Project
4*79330504STreehugger Robot **
5*79330504STreehugger Robot ** Licensed under the Apache License, Version 2.0 (the "License");
6*79330504STreehugger Robot ** you may not use this file except in compliance with the License.
7*79330504STreehugger Robot ** You may obtain a copy of the License at
8*79330504STreehugger Robot **
9*79330504STreehugger Robot **     http://www.apache.org/licenses/LICENSE-2.0
10*79330504STreehugger Robot **
11*79330504STreehugger Robot ** Unless required by applicable law or agreed to in writing, software
12*79330504STreehugger Robot ** distributed under the License is distributed on an "AS IS" BASIS,
13*79330504STreehugger Robot ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*79330504STreehugger Robot ** See the License for the specific language governing permissions and
15*79330504STreehugger Robot ** limitations under the License.
16*79330504STreehugger Robot */
17*79330504STreehugger Robot 
18*79330504STreehugger Robot #include <cutils/properties.h>
19*79330504STreehugger Robot #include <string.h>
20*79330504STreehugger Robot #include <unistd.h>
21*79330504STreehugger Robot //#define LOG_NDEBUG 0
22*79330504STreehugger Robot 
23*79330504STreehugger Robot #define LOG_TAG "AudioHardwareInterface"
24*79330504STreehugger Robot #include <utils/Log.h>
25*79330504STreehugger Robot #include <utils/String8.h>
26*79330504STreehugger Robot 
27*79330504STreehugger Robot #include "AudioHardwareStub.h"
28*79330504STreehugger Robot #include "AudioHardwareGeneric.h"
29*79330504STreehugger Robot 
30*79330504STreehugger Robot #ifdef ENABLE_AUDIO_DUMP
31*79330504STreehugger Robot #include "AudioDumpInterface.h"
32*79330504STreehugger Robot #endif
33*79330504STreehugger Robot 
34*79330504STreehugger Robot 
35*79330504STreehugger Robot // change to 1 to log routing calls
36*79330504STreehugger Robot #define LOG_ROUTING_CALLS 1
37*79330504STreehugger Robot 
38*79330504STreehugger Robot namespace android_audio_legacy {
39*79330504STreehugger Robot 
40*79330504STreehugger Robot #if LOG_ROUTING_CALLS
41*79330504STreehugger Robot static const char* routingModeStrings[] =
42*79330504STreehugger Robot {
43*79330504STreehugger Robot     "OUT OF RANGE",
44*79330504STreehugger Robot     "INVALID",
45*79330504STreehugger Robot     "CURRENT",
46*79330504STreehugger Robot     "NORMAL",
47*79330504STreehugger Robot     "RINGTONE",
48*79330504STreehugger Robot     "IN_CALL",
49*79330504STreehugger Robot     "IN_COMMUNICATION"
50*79330504STreehugger Robot };
51*79330504STreehugger Robot 
52*79330504STreehugger Robot static const char* routeNone = "NONE";
53*79330504STreehugger Robot 
displayMode(int mode)54*79330504STreehugger Robot static const char* displayMode(int mode)
55*79330504STreehugger Robot {
56*79330504STreehugger Robot     if ((mode < AudioSystem::MODE_INVALID) || (mode >= AudioSystem::NUM_MODES))
57*79330504STreehugger Robot         return routingModeStrings[0];
58*79330504STreehugger Robot     return routingModeStrings[mode+3];
59*79330504STreehugger Robot }
60*79330504STreehugger Robot #endif
61*79330504STreehugger Robot 
62*79330504STreehugger Robot // ----------------------------------------------------------------------------
63*79330504STreehugger Robot 
create()64*79330504STreehugger Robot AudioHardwareInterface* AudioHardwareInterface::create()
65*79330504STreehugger Robot {
66*79330504STreehugger Robot     return NULL;
67*79330504STreehugger Robot }
68*79330504STreehugger Robot 
~AudioStreamOut()69*79330504STreehugger Robot AudioStreamOut::~AudioStreamOut()
70*79330504STreehugger Robot {
71*79330504STreehugger Robot }
72*79330504STreehugger Robot 
73*79330504STreehugger Robot // default implementation is unsupported
getNextWriteTimestamp(int64_t * timestamp)74*79330504STreehugger Robot status_t AudioStreamOut::getNextWriteTimestamp(int64_t *timestamp)
75*79330504STreehugger Robot {
76*79330504STreehugger Robot     return INVALID_OPERATION;
77*79330504STreehugger Robot }
78*79330504STreehugger Robot 
~AudioStreamIn()79*79330504STreehugger Robot AudioStreamIn::~AudioStreamIn() {}
80*79330504STreehugger Robot 
AudioHardwareBase()81*79330504STreehugger Robot AudioHardwareBase::AudioHardwareBase()
82*79330504STreehugger Robot {
83*79330504STreehugger Robot     mMode = 0;
84*79330504STreehugger Robot }
85*79330504STreehugger Robot 
setMode(int mode)86*79330504STreehugger Robot status_t AudioHardwareBase::setMode(int mode)
87*79330504STreehugger Robot {
88*79330504STreehugger Robot #if LOG_ROUTING_CALLS
89*79330504STreehugger Robot     ALOGD("setMode(%s)", displayMode(mode));
90*79330504STreehugger Robot #endif
91*79330504STreehugger Robot     if ((mode < 0) || (mode >= AudioSystem::NUM_MODES))
92*79330504STreehugger Robot         return BAD_VALUE;
93*79330504STreehugger Robot     if (mMode == mode)
94*79330504STreehugger Robot         return ALREADY_EXISTS;
95*79330504STreehugger Robot     mMode = mode;
96*79330504STreehugger Robot     return NO_ERROR;
97*79330504STreehugger Robot }
98*79330504STreehugger Robot 
99*79330504STreehugger Robot // default implementation
setParameters(const String8 & keyValuePairs)100*79330504STreehugger Robot status_t AudioHardwareBase::setParameters(const String8& keyValuePairs)
101*79330504STreehugger Robot {
102*79330504STreehugger Robot     return NO_ERROR;
103*79330504STreehugger Robot }
104*79330504STreehugger Robot 
105*79330504STreehugger Robot // default implementation
getParameters(const String8 & keys)106*79330504STreehugger Robot String8 AudioHardwareBase::getParameters(const String8& keys)
107*79330504STreehugger Robot {
108*79330504STreehugger Robot     AudioParameter param = AudioParameter(keys);
109*79330504STreehugger Robot     return param.toString();
110*79330504STreehugger Robot }
111*79330504STreehugger Robot 
112*79330504STreehugger Robot // default implementation
getInputBufferSize(uint32_t sampleRate,int format,int channelCount)113*79330504STreehugger Robot size_t AudioHardwareBase::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
114*79330504STreehugger Robot {
115*79330504STreehugger Robot     if (sampleRate != 8000) {
116*79330504STreehugger Robot         ALOGW("getInputBufferSize bad sampling rate: %d", sampleRate);
117*79330504STreehugger Robot         return 0;
118*79330504STreehugger Robot     }
119*79330504STreehugger Robot     if (format != AudioSystem::PCM_16_BIT) {
120*79330504STreehugger Robot         ALOGW("getInputBufferSize bad format: %d", format);
121*79330504STreehugger Robot         return 0;
122*79330504STreehugger Robot     }
123*79330504STreehugger Robot     if (channelCount != 1) {
124*79330504STreehugger Robot         ALOGW("getInputBufferSize bad channel count: %d", channelCount);
125*79330504STreehugger Robot         return 0;
126*79330504STreehugger Robot     }
127*79330504STreehugger Robot 
128*79330504STreehugger Robot     return 320;
129*79330504STreehugger Robot }
130*79330504STreehugger Robot 
131*79330504STreehugger Robot // default implementation is unsupported
getMasterVolume(float * volume)132*79330504STreehugger Robot status_t AudioHardwareBase::getMasterVolume(float *volume)
133*79330504STreehugger Robot {
134*79330504STreehugger Robot     return INVALID_OPERATION;
135*79330504STreehugger Robot }
136*79330504STreehugger Robot 
dumpState(int fd,const Vector<String16> & args)137*79330504STreehugger Robot status_t AudioHardwareBase::dumpState(int fd, const Vector<String16>& args)
138*79330504STreehugger Robot {
139*79330504STreehugger Robot     const size_t SIZE = 256;
140*79330504STreehugger Robot     char buffer[SIZE];
141*79330504STreehugger Robot     String8 result;
142*79330504STreehugger Robot     snprintf(buffer, SIZE, "AudioHardwareBase::dumpState\n");
143*79330504STreehugger Robot     result.append(buffer);
144*79330504STreehugger Robot     snprintf(buffer, SIZE, "\tmMode: %d\n", mMode);
145*79330504STreehugger Robot     result.append(buffer);
146*79330504STreehugger Robot     ::write(fd, result.c_str(), result.size());
147*79330504STreehugger Robot     dump(fd, args);  // Dump the state of the concrete child.
148*79330504STreehugger Robot     return NO_ERROR;
149*79330504STreehugger Robot }
150*79330504STreehugger Robot 
151*79330504STreehugger Robot // default implementation calls its "without flags" counterpart
openOutputStreamWithFlags(uint32_t devices,audio_output_flags_t flags,int * format,uint32_t * channels,uint32_t * sampleRate,status_t * status)152*79330504STreehugger Robot AudioStreamOut* AudioHardwareInterface::openOutputStreamWithFlags(uint32_t devices,
153*79330504STreehugger Robot                                           audio_output_flags_t flags,
154*79330504STreehugger Robot                                           int *format,
155*79330504STreehugger Robot                                           uint32_t *channels,
156*79330504STreehugger Robot                                           uint32_t *sampleRate,
157*79330504STreehugger Robot                                           status_t *status)
158*79330504STreehugger Robot {
159*79330504STreehugger Robot     return openOutputStream(devices, format, channels, sampleRate, status);
160*79330504STreehugger Robot }
161*79330504STreehugger Robot 
162*79330504STreehugger Robot // ----------------------------------------------------------------------------
163*79330504STreehugger Robot 
164*79330504STreehugger Robot }; // namespace android
165