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
30f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#ifdef ENABLE_AUDIO_DUMP
31f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include "AudioDumpInterface.h"
32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif
33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// change to 1 to log routing calls
36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#define LOG_ROUTING_CALLS 1
37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
38e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy {
39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#if LOG_ROUTING_CALLS
41f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatic const char* routingModeStrings[] =
42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "OUT OF RANGE",
44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "INVALID",
45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "CURRENT",
46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "NORMAL",
47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "RINGTONE",
48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "IN_CALL",
49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    "IN_COMMUNICATION"
50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin};
51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatic const char* routeNone = "NONE";
53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatic const char* displayMode(int mode)
55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if ((mode < AudioSystem::MODE_INVALID) || (mode >= AudioSystem::NUM_MODES))
57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return routingModeStrings[0];
58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return routingModeStrings[mode+3];
59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif
61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioHardwareInterface* AudioHardwareInterface::create()
65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
66e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return NULL;
67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamOut::~AudioStreamOut()
70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
735b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman// default implementation is unsupported
745b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossmanstatus_t AudioStreamOut::getNextWriteTimestamp(int64_t *timestamp)
755b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman{
765b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman    return INVALID_OPERATION;
775b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman}
785b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman
79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamIn::~AudioStreamIn() {}
80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioHardwareBase::AudioHardwareBase()
82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mMode = 0;
84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareBase::setMode(int mode)
87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#if LOG_ROUTING_CALLS
89b381b932acfa441da5607f37ac4ef6573ed5be96Steve Block    ALOGD("setMode(%s)", displayMode(mode));
90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#endif
91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if ((mode < 0) || (mode >= AudioSystem::NUM_MODES))
92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return BAD_VALUE;
93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mMode == mode)
94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return ALREADY_EXISTS;
95f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mMode = mode;
96f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
97f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// default implementation
100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareBase::setParameters(const String8& keyValuePairs)
101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// default implementation
106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioHardwareBase::getParameters(const String8& keys)
107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keys);
109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return param.toString();
110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
111f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// default implementation
113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinsize_t AudioHardwareBase::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
115f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (sampleRate != 8000) {
11664cca04dcbf4e21a51131224b9d0f0c596f876d4Steve Block        ALOGW("getInputBufferSize bad sampling rate: %d", sampleRate);
117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return 0;
118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (format != AudioSystem::PCM_16_BIT) {
12064cca04dcbf4e21a51131224b9d0f0c596f876d4Steve Block        ALOGW("getInputBufferSize bad format: %d", format);
121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return 0;
122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (channelCount != 1) {
12464cca04dcbf4e21a51131224b9d0f0c596f876d4Steve Block        ALOGW("getInputBufferSize bad channel count: %d", channelCount);
125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return 0;
126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return 320;
129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
1315b71e6fd76fe244719cb5a3f9ac24572acd9a3caJohn Grossman// default implementation is unsupported
132617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossmanstatus_t AudioHardwareBase::getMasterVolume(float *volume)
133617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossman{
134617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossman    return INVALID_OPERATION;
135617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossman}
136617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossman
137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareBase::dumpState(int fd, const Vector<String16>& args)
138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
139f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    const size_t SIZE = 256;
140f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    char buffer[SIZE];
141f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    String8 result;
142f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    snprintf(buffer, SIZE, "AudioHardwareBase::dumpState\n");
143f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    result.append(buffer);
144f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    snprintf(buffer, SIZE, "\tmMode: %d\n", mMode);
145f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    result.append(buffer);
146f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    ::write(fd, result.string(), result.size());
147f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    dump(fd, args);  // Dump the state of the concrete child.
148f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
149f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
150f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
151f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
152f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
153f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
154