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