blob: 7159b0b8e83bd8f20739481a516be928bdf9f0d5 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/* //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"
Dave Sparksa5a11d42009-05-19 14:38:46 -070026#include <media/AudioRecord.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080027
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(
Dave Sparksa5a11d42009-05-19 14:38:46 -070060 int inputSource, int format, int channelCount, uint32_t sampleRate,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080061 status_t *status, AudioSystem::audio_in_acoustics acoustics)
62{
Dave Sparksa5a11d42009-05-19 14:38:46 -070063 // check for valid input source
64 if ((inputSource != AudioRecord::DEFAULT_INPUT) &&
65 (inputSource != AudioRecord::MIC_INPUT)) {
66 return 0;
67 }
68
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080069 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
Dave Sparksa5a11d42009-05-19 14:38:46 -070080// DEPRECATED
81AudioStreamIn* AudioHardwareStub::openInputStream(
82 int format, int channelCount, uint32_t sampleRate, status_t *status,
83 AudioSystem::audio_in_acoustics acoustic_flags)
84{
85 return openInputStream(AudioRecord::DEFAULT_INPUT, format, channelCount,
86 sampleRate, status, acoustic_flags);
87}
88
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080089status_t AudioHardwareStub::setVoiceVolume(float volume)
90{
91 return NO_ERROR;
92}
93
94status_t AudioHardwareStub::setMasterVolume(float volume)
95{
96 return NO_ERROR;
97}
98
99status_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
111status_t AudioHardwareStub::dump(int fd, const Vector<String16>& args)
112{
113 dumpInternals(fd, args);
114 return NO_ERROR;
115}
116
117// ----------------------------------------------------------------------------
118
119status_t AudioStreamOutStub::set(int format, int channels, uint32_t rate)
120{
121 // fix up defaults
122 if (format == 0) format = AudioSystem::PCM_16_BIT;
123 if (channels == 0) channels = channelCount();
124 if (rate == 0) rate = sampleRate();
125
126 if ((format == AudioSystem::PCM_16_BIT) &&
127 (channels == channelCount()) &&
128 (rate == sampleRate()))
129 return NO_ERROR;
130 return BAD_VALUE;
131}
132
133ssize_t AudioStreamOutStub::write(const void* buffer, size_t bytes)
134{
135 // fake timing for audio output
136 usleep(bytes * 1000000 / sizeof(int16_t) / channelCount() / sampleRate());
137 return bytes;
138}
139
140status_t AudioStreamOutStub::standby()
141{
142 return NO_ERROR;
143}
144
145status_t AudioStreamOutStub::dump(int fd, const Vector<String16>& args)
146{
147 const size_t SIZE = 256;
148 char buffer[SIZE];
149 String8 result;
150 snprintf(buffer, SIZE, "AudioStreamOutStub::dump\n");
151 snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate());
152 snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize());
153 snprintf(buffer, SIZE, "\tchannel count: %d\n", channelCount());
154 snprintf(buffer, SIZE, "\tformat: %d\n", format());
155 result.append(buffer);
156 ::write(fd, result.string(), result.size());
157 return NO_ERROR;
158}
159
160// ----------------------------------------------------------------------------
161
162status_t AudioStreamInStub::set(int format, int channels, uint32_t rate,
163 AudioSystem::audio_in_acoustics acoustics)
164{
165 if ((format == AudioSystem::PCM_16_BIT) &&
166 (channels == channelCount()) &&
167 (rate == sampleRate()))
168 return NO_ERROR;
169 return BAD_VALUE;
170}
171
172ssize_t AudioStreamInStub::read(void* buffer, ssize_t bytes)
173{
174 // fake timing for audio input
175 usleep(bytes * 1000000 / sizeof(int16_t) / channelCount() / sampleRate());
176 memset(buffer, 0, bytes);
177 return bytes;
178}
179
180status_t AudioStreamInStub::dump(int fd, const Vector<String16>& args)
181{
182 const size_t SIZE = 256;
183 char buffer[SIZE];
184 String8 result;
185 snprintf(buffer, SIZE, "AudioStreamInStub::dump\n");
186 result.append(buffer);
187 snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate());
188 result.append(buffer);
189 snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize());
190 result.append(buffer);
191 snprintf(buffer, SIZE, "\tchannel count: %d\n", channelCount());
192 result.append(buffer);
193 snprintf(buffer, SIZE, "\tformat: %d\n", format());
194 result.append(buffer);
195 ::write(fd, result.string(), result.size());
196 return NO_ERROR;
197}
198
199// ----------------------------------------------------------------------------
200
201}; // namespace android