AudioHardwareStub.cpp revision f01215993dda68b6b52111d754bd0c7c2d5bcfa3
1f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin/* //device/servers/AudioFlinger/AudioHardwareStub.cpp 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 <stdint.h> 19f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <sys/types.h> 20f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 21f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <stdlib.h> 22f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <unistd.h> 23f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <utils/String8.h> 24f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 25f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include "AudioHardwareStub.h" 26f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <media/AudioRecord.h> 27f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 28f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinnamespace android { 29f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 30f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ---------------------------------------------------------------------------- 31f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioHardwareStub::AudioHardwareStub() : mMicMute(false) 33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioHardwareStub::~AudioHardwareStub() 37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 38f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareStub::initCheck() 41f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamOut* AudioHardwareStub::openOutputStream( 46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, status_t *status) 47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin AudioStreamOutStub* out = new AudioStreamOutStub(); 49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin status_t lStatus = out->set(format, channels, sampleRate); 50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (status) { 51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *status = lStatus; 52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin } 53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (lStatus == NO_ERROR) 54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return out; 55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin delete out; 56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return 0; 57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioHardwareStub::closeOutputStream(AudioStreamOut* out) 60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin delete out; 62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamIn* AudioHardwareStub::openInputStream( 65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, 66f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin status_t *status, AudioSystem::audio_in_acoustics acoustics) 67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin // check for valid input source 69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (!AudioSystem::isInputDevice((AudioSystem::audio_devices)devices)) { 70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return 0; 71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin } 72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 73f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin AudioStreamInStub* in = new AudioStreamInStub(); 74f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin status_t lStatus = in->set(format, channels, sampleRate, acoustics); 75f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (status) { 76f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin *status = lStatus; 77f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin } 78f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (lStatus == NO_ERROR) 79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return in; 80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin delete in; 81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return 0; 82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioHardwareStub::closeInputStream(AudioStreamIn* in) 85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin delete in; 87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 89f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareStub::setVoiceVolume(float volume) 90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareStub::setMasterVolume(float volume) 95f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 96f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 97f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareStub::dumpInternals(int fd, const Vector<String16>& args) 100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin const size_t SIZE = 256; 102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin char buffer[SIZE]; 103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin String8 result; 104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append("AudioHardwareStub::dumpInternals\n"); 105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tmMicMute: %s\n", mMicMute? "true": "false"); 106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin ::write(fd, result.string(), result.size()); 108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 111f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioHardwareStub::dump(int fd, const Vector<String16>& args) 112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin dumpInternals(fd, args); 114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 115f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 116f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ---------------------------------------------------------------------------- 118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutStub::set(int *pFormat, uint32_t *pChannels, uint32_t *pRate) 120f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (pFormat) *pFormat = format(); 122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (pChannels) *pChannels = channels(); 123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin if (pRate) *pRate = sampleRate(); 124f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinssize_t AudioStreamOutStub::write(const void* buffer, size_t bytes) 129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin // fake timing for audio output 131f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin usleep(bytes * 1000000 / sizeof(int16_t) / AudioSystem::popCount(channels()) / sampleRate()); 132f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return bytes; 133f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 134f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 135f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutStub::standby() 136f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 139f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 140f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutStub::dump(int fd, const Vector<String16>& args) 141f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 142f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin const size_t SIZE = 256; 143f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin char buffer[SIZE]; 144f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin String8 result; 145f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "AudioStreamOutStub::dump\n"); 146f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate()); 147f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize()); 148f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tchannels: %d\n", channels()); 149f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tformat: %d\n", format()); 150f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 151f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin ::write(fd, result.string(), result.size()); 152f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 153f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 154f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 155f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioStreamOutStub::getParameters(const String8& keys) 156f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 157f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin AudioParameter param = AudioParameter(keys); 158f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return param.toString(); 159f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 160f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 161f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutStub::getRenderPosition(uint32_t *dspFrames) 162f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 163f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return INVALID_OPERATION; 164f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 165f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 166f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ---------------------------------------------------------------------------- 167f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 168f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInStub::set(int *pFormat, uint32_t *pChannels, uint32_t *pRate, 169f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin AudioSystem::audio_in_acoustics acoustics) 170f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 171f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 172f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 173f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 174f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinssize_t AudioStreamInStub::read(void* buffer, ssize_t bytes) 175f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 176f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin // fake timing for audio input 177f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin usleep(bytes * 1000000 / sizeof(int16_t) / AudioSystem::popCount(channels()) / sampleRate()); 178f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin memset(buffer, 0, bytes); 179f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return bytes; 180f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 181f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 182f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInStub::dump(int fd, const Vector<String16>& args) 183f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 184f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin const size_t SIZE = 256; 185f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin char buffer[SIZE]; 186f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin String8 result; 187f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "AudioStreamInStub::dump\n"); 188f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 189f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate()); 190f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 191f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize()); 192f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 193f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tchannels: %d\n", channels()); 194f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 195f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin snprintf(buffer, SIZE, "\tformat: %d\n", format()); 196f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin result.append(buffer); 197f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin ::write(fd, result.string(), result.size()); 198f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return NO_ERROR; 199f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 200f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 201f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioStreamInStub::getParameters(const String8& keys) 202f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{ 203f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin AudioParameter param = AudioParameter(keys); 204f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin return param.toString(); 205f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin} 206f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 207f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ---------------------------------------------------------------------------- 208f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin 209f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android 210