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