blob: d309902a0d548c5dee2a7ae73dd0dfd1c2094fdf [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/* //device/servers/AudioFlinger/AudioHardwareStub.cpp
2**
3** Copyright 2007, The Android Open Source Project
4**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -08005** 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
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07008**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -08009** http://www.apache.org/licenses/LICENSE-2.0
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070010**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080011** 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
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070015** 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
27namespace android {
28
29// ----------------------------------------------------------------------------
30
31AudioHardwareStub::AudioHardwareStub() : mMicMute(false)
32{
33}
34
35AudioHardwareStub::~AudioHardwareStub()
36{
37}
38
39status_t AudioHardwareStub::initCheck()
40{
41 return NO_ERROR;
42}
43
44status_t AudioHardwareStub::standby()
45{
46 return NO_ERROR;
47}
48
49AudioStreamOut* AudioHardwareStub::openOutputStream(
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080050 int format, int channelCount, uint32_t sampleRate, status_t *status)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070051{
52 AudioStreamOutStub* out = new AudioStreamOutStub();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080053 status_t lStatus = out->set(format, channelCount, sampleRate);
54 if (status) {
55 *status = lStatus;
56 }
57 if (lStatus == NO_ERROR)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070058 return out;
59 delete out;
60 return 0;
61}
62
63AudioStreamIn* AudioHardwareStub::openInputStream(
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080064 int format, int channelCount, uint32_t sampleRate, status_t *status)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070065{
66 AudioStreamInStub* in = new AudioStreamInStub();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080067 status_t lStatus = in->set(format, channelCount, sampleRate);
68 if (status) {
69 *status = lStatus;
70 }
71 if (lStatus == NO_ERROR)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070072 return in;
73 delete in;
74 return 0;
75}
76
77status_t AudioHardwareStub::setVoiceVolume(float volume)
78{
79 return NO_ERROR;
80}
81
82status_t AudioHardwareStub::setMasterVolume(float volume)
83{
84 return NO_ERROR;
85}
86
87status_t AudioHardwareStub::dumpInternals(int fd, const Vector<String16>& args)
88{
89 const size_t SIZE = 256;
90 char buffer[SIZE];
91 String8 result;
92 result.append("AudioHardwareStub::dumpInternals\n");
93 snprintf(buffer, SIZE, "\tmMicMute: %s\n", mMicMute? "true": "false");
94 result.append(buffer);
95 ::write(fd, result.string(), result.size());
96 return NO_ERROR;
97}
98
99status_t AudioHardwareStub::dump(int fd, const Vector<String16>& args)
100{
101 dumpInternals(fd, args);
102 return NO_ERROR;
103}
104
105// ----------------------------------------------------------------------------
106
107status_t AudioStreamOutStub::set(int format, int channels, uint32_t rate)
108{
109 // fix up defaults
110 if (format == 0) format = AudioSystem::PCM_16_BIT;
111 if (channels == 0) channels = channelCount();
112 if (rate == 0) rate = sampleRate();
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800113
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700114 if ((format == AudioSystem::PCM_16_BIT) &&
115 (channels == channelCount()) &&
116 (rate == sampleRate()))
117 return NO_ERROR;
118 return BAD_VALUE;
119}
120
121ssize_t AudioStreamOutStub::write(const void* buffer, size_t bytes)
122{
123 // fake timing for audio output
124 usleep(bytes * 1000000 / sizeof(int16_t) / channelCount() / sampleRate());
125 return bytes;
126}
127
128status_t AudioStreamOutStub::dump(int fd, const Vector<String16>& args)
129{
130 const size_t SIZE = 256;
131 char buffer[SIZE];
132 String8 result;
133 snprintf(buffer, SIZE, "AudioStreamOutStub::dump\n");
134 snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate());
135 snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize());
136 snprintf(buffer, SIZE, "\tchannel count: %d\n", channelCount());
137 snprintf(buffer, SIZE, "\tformat: %d\n", format());
138 result.append(buffer);
139 ::write(fd, result.string(), result.size());
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800140 return NO_ERROR;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700141}
142
143// ----------------------------------------------------------------------------
144
145status_t AudioStreamInStub::set(int format, int channels, uint32_t rate)
146{
147 if ((format == AudioSystem::PCM_16_BIT) &&
148 (channels == channelCount()) &&
149 (rate == sampleRate()))
150 return NO_ERROR;
151 return BAD_VALUE;
152}
153
154ssize_t AudioStreamInStub::read(void* buffer, ssize_t bytes)
155{
156 // fake timing for audio input
157 usleep(bytes * 1000000 / sizeof(int16_t) / channelCount() / sampleRate());
158 memset(buffer, 0, bytes);
159 return bytes;
160}
161
162status_t AudioStreamInStub::dump(int fd, const Vector<String16>& args)
163{
164 const size_t SIZE = 256;
165 char buffer[SIZE];
166 String8 result;
167 snprintf(buffer, SIZE, "AudioStreamInStub::dump\n");
168 result.append(buffer);
169 snprintf(buffer, SIZE, "\tsample rate: %d\n", sampleRate());
170 result.append(buffer);
171 snprintf(buffer, SIZE, "\tbuffer size: %d\n", bufferSize());
172 result.append(buffer);
173 snprintf(buffer, SIZE, "\tchannel count: %d\n", channelCount());
174 result.append(buffer);
175 snprintf(buffer, SIZE, "\tformat: %d\n", format());
176 result.append(buffer);
177 ::write(fd, result.string(), result.size());
178 return NO_ERROR;
179}
180
181// ----------------------------------------------------------------------------
182
183}; // namespace android