AudioHardwareInterface.cpp revision f01215993dda68b6b52111d754bd0c7c2d5bcfa3
1/*
2**
3** Copyright 2007, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include <cutils/properties.h>
19#include <string.h>
20#include <unistd.h>
21//#define LOG_NDEBUG 0
22
23#define LOG_TAG "AudioHardwareInterface"
24#include <utils/Log.h>
25#include <utils/String8.h>
26
27#include "AudioHardwareStub.h"
28#include "AudioHardwareGeneric.h"
29#ifdef WITH_A2DP
30#include "A2dpAudioInterface.h"
31#endif
32
33#ifdef ENABLE_AUDIO_DUMP
34#include "AudioDumpInterface.h"
35#endif
36
37
38// change to 1 to log routing calls
39#define LOG_ROUTING_CALLS 1
40
41namespace android {
42
43#if LOG_ROUTING_CALLS
44static const char* routingModeStrings[] =
45{
46    "OUT OF RANGE",
47    "INVALID",
48    "CURRENT",
49    "NORMAL",
50    "RINGTONE",
51    "IN_CALL",
52    "IN_COMMUNICATION"
53};
54
55static const char* routeNone = "NONE";
56
57static const char* displayMode(int mode)
58{
59    if ((mode < AudioSystem::MODE_INVALID) || (mode >= AudioSystem::NUM_MODES))
60        return routingModeStrings[0];
61    return routingModeStrings[mode+3];
62}
63#endif
64
65// ----------------------------------------------------------------------------
66
67AudioHardwareInterface* AudioHardwareInterface::create()
68{
69    /*
70     * FIXME: This code needs to instantiate the correct audio device
71     * interface. For now - we use compile-time switches.
72     */
73    AudioHardwareInterface* hw = 0;
74    char value[PROPERTY_VALUE_MAX];
75
76#ifdef GENERIC_AUDIO
77    hw = new AudioHardwareGeneric();
78#else
79    // if running in emulation - use the emulator driver
80    if (property_get("ro.kernel.qemu", value, 0)) {
81        LOGD("Running in emulation - using generic audio driver");
82        hw = new AudioHardwareGeneric();
83    }
84    else {
85        LOGV("Creating Vendor Specific AudioHardware");
86        hw = createAudioHardware();
87    }
88#endif
89    if (hw->initCheck() != NO_ERROR) {
90        LOGW("Using stubbed audio hardware. No sound will be produced.");
91        delete hw;
92        hw = new AudioHardwareStub();
93    }
94
95#ifdef WITH_A2DP
96    hw = new A2dpAudioInterface(hw);
97#endif
98
99#ifdef ENABLE_AUDIO_DUMP
100    // This code adds a record of buffers in a file to write calls made by AudioFlinger.
101    // It replaces the current AudioHardwareInterface object by an intermediate one which
102    // will record buffers in a file (after sending them to hardware) for testing purpose.
103    // This feature is enabled by defining symbol ENABLE_AUDIO_DUMP.
104    // The output file is set with setParameters("test_cmd_file_name=<name>"). Pause are not recorded in the file.
105    LOGV("opening PCM dump interface");
106    hw = new AudioDumpInterface(hw);    // replace interface
107#endif
108    return hw;
109}
110
111AudioStreamOut::~AudioStreamOut()
112{
113}
114
115AudioStreamIn::~AudioStreamIn() {}
116
117AudioHardwareBase::AudioHardwareBase()
118{
119    mMode = 0;
120}
121
122status_t AudioHardwareBase::setMode(int mode)
123{
124#if LOG_ROUTING_CALLS
125    LOGD("setMode(%s)", displayMode(mode));
126#endif
127    if ((mode < 0) || (mode >= AudioSystem::NUM_MODES))
128        return BAD_VALUE;
129    if (mMode == mode)
130        return ALREADY_EXISTS;
131    mMode = mode;
132    return NO_ERROR;
133}
134
135// default implementation
136status_t AudioHardwareBase::setParameters(const String8& keyValuePairs)
137{
138    return NO_ERROR;
139}
140
141// default implementation
142String8 AudioHardwareBase::getParameters(const String8& keys)
143{
144    AudioParameter param = AudioParameter(keys);
145    return param.toString();
146}
147
148// default implementation
149size_t AudioHardwareBase::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
150{
151    if (sampleRate != 8000) {
152        LOGW("getInputBufferSize bad sampling rate: %d", sampleRate);
153        return 0;
154    }
155    if (format != AudioSystem::PCM_16_BIT) {
156        LOGW("getInputBufferSize bad format: %d", format);
157        return 0;
158    }
159    if (channelCount != 1) {
160        LOGW("getInputBufferSize bad channel count: %d", channelCount);
161        return 0;
162    }
163
164    return 320;
165}
166
167status_t AudioHardwareBase::dumpState(int fd, const Vector<String16>& args)
168{
169    const size_t SIZE = 256;
170    char buffer[SIZE];
171    String8 result;
172    snprintf(buffer, SIZE, "AudioHardwareBase::dumpState\n");
173    result.append(buffer);
174    snprintf(buffer, SIZE, "\tmMode: %d\n", mMode);
175    result.append(buffer);
176    ::write(fd, result.string(), result.size());
177    dump(fd, args);  // Dump the state of the concrete child.
178    return NO_ERROR;
179}
180
181// ----------------------------------------------------------------------------
182
183}; // namespace android
184