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 151cc029e59f7d22f383dfc5b700689db66a941a356David Wagner// default implementation calls its "without flags" counterpart 152cc029e59f7d22f383dfc5b700689db66a941a356David WagnerAudioStreamOut* AudioHardwareInterface::openOutputStreamWithFlags(uint32_t devices, 153cc029e59f7d22f383dfc5b700689db66a941a356David Wagner audio_output_flags_t flags, 154cc029e59f7d22f383dfc5b700689db66a941a356David Wagner int *format, 155cc029e59f7d22f383dfc5b700689db66a941a356David Wagner uint32_t *channels, 156cc029e59f7d22f383dfc5b700689db66a941a356David Wagner uint32_t *sampleRate, 157cc029e59f7d22f383dfc5b700689db66a941a356David Wagner status_t *status) 158cc029e59f7d22f383dfc5b700689db66a941a356David Wagner{ 159cc029e59f7d22f383dfc5b700689db66a941a356David Wagner return openOutputStream(devices, format, channels, sampleRate, status); 160cc029e59f7d22f383dfc5b700689db66a941a356David Wagner} 161cc029e59f7d22f383dfc5b700689db66a941a356David Wagner 162f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ---------------------------------------------------------------------------- 163f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 164f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android 165