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