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
28e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy {
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
207a527ffd3c2ce72048a8fae51cd399024af4439b9Richard FitzgeraldAudioHardwareInterface* createAudioHardware(void) {
208a527ffd3c2ce72048a8fae51cd399024af4439b9Richard Fitzgerald    return new AudioHardwareStub();
209a527ffd3c2ce72048a8fae51cd399024af4439b9Richard Fitzgerald}
210a527ffd3c2ce72048a8fae51cd399024af4439b9Richard Fitzgerald
211f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
212f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
213f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
214