AudioStreamOut.cpp revision 062e67a26e0553dd142be622821f493df541f0c6
1062e67a26e0553dd142be622821f493df541f0c6Phil Burk/*
2062e67a26e0553dd142be622821f493df541f0c6Phil Burk**
3062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Copyright 2015, The Android Open Source Project
4062e67a26e0553dd142be622821f493df541f0c6Phil Burk**
5062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Licensed under the Apache License, Version 2.0 (the "License");
6062e67a26e0553dd142be622821f493df541f0c6Phil Burk** you may not use this file except in compliance with the License.
7062e67a26e0553dd142be622821f493df541f0c6Phil Burk** You may obtain a copy of the License at
8062e67a26e0553dd142be622821f493df541f0c6Phil Burk**
9062e67a26e0553dd142be622821f493df541f0c6Phil Burk**     http://www.apache.org/licenses/LICENSE-2.0
10062e67a26e0553dd142be622821f493df541f0c6Phil Burk**
11062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Unless required by applicable law or agreed to in writing, software
12062e67a26e0553dd142be622821f493df541f0c6Phil Burk** distributed under the License is distributed on an "AS IS" BASIS,
13062e67a26e0553dd142be622821f493df541f0c6Phil Burk** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14062e67a26e0553dd142be622821f493df541f0c6Phil Burk** See the License for the specific language governing permissions and
15062e67a26e0553dd142be622821f493df541f0c6Phil Burk** limitations under the License.
16062e67a26e0553dd142be622821f493df541f0c6Phil Burk*/
17062e67a26e0553dd142be622821f493df541f0c6Phil Burk
18062e67a26e0553dd142be622821f493df541f0c6Phil Burk#define LOG_TAG "AudioFlinger"
19062e67a26e0553dd142be622821f493df541f0c6Phil Burk//#define LOG_NDEBUG 0
20062e67a26e0553dd142be622821f493df541f0c6Phil Burk
21062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <hardware/audio.h>
22062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <utils/Log.h>
23062e67a26e0553dd142be622821f493df541f0c6Phil Burk
24062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include "AudioHwDevice.h"
25062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include "AudioStreamOut.h"
26062e67a26e0553dd142be622821f493df541f0c6Phil Burk
27062e67a26e0553dd142be622821f493df541f0c6Phil Burknamespace android {
28062e67a26e0553dd142be622821f493df541f0c6Phil Burk
29062e67a26e0553dd142be622821f493df541f0c6Phil Burk// ----------------------------------------------------------------------------
30062e67a26e0553dd142be622821f493df541f0c6Phil Burk
31062e67a26e0553dd142be622821f493df541f0c6Phil BurkAudioStreamOut::AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags)
32062e67a26e0553dd142be622821f493df541f0c6Phil Burk        : audioHwDev(dev)
33062e67a26e0553dd142be622821f493df541f0c6Phil Burk        , stream(NULL)
34062e67a26e0553dd142be622821f493df541f0c6Phil Burk        , flags(flags)
35062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
36062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
37062e67a26e0553dd142be622821f493df541f0c6Phil Burk
38062e67a26e0553dd142be622821f493df541f0c6Phil Burkaudio_hw_device_t* AudioStreamOut::hwDev() const
39062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
40062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return audioHwDev->hwDevice();
41062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
42062e67a26e0553dd142be622821f493df541f0c6Phil Burk
43062e67a26e0553dd142be622821f493df541f0c6Phil Burkstatus_t AudioStreamOut::getRenderPosition(uint32_t *frames)
44062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
45062e67a26e0553dd142be622821f493df541f0c6Phil Burk    if (stream == NULL) {
46062e67a26e0553dd142be622821f493df541f0c6Phil Burk        return NO_INIT;
47062e67a26e0553dd142be622821f493df541f0c6Phil Burk    }
48062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return stream->get_render_position(stream, frames);
49062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
50062e67a26e0553dd142be622821f493df541f0c6Phil Burk
51062e67a26e0553dd142be622821f493df541f0c6Phil Burkstatus_t AudioStreamOut::getPresentationPosition(uint64_t *frames, struct timespec *timestamp)
52062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
53062e67a26e0553dd142be622821f493df541f0c6Phil Burk    if (stream == NULL) {
54062e67a26e0553dd142be622821f493df541f0c6Phil Burk        return NO_INIT;
55062e67a26e0553dd142be622821f493df541f0c6Phil Burk    }
56062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return stream->get_presentation_position(stream, frames, timestamp);
57062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
58062e67a26e0553dd142be622821f493df541f0c6Phil Burk
59062e67a26e0553dd142be622821f493df541f0c6Phil Burkstatus_t AudioStreamOut::open(
60062e67a26e0553dd142be622821f493df541f0c6Phil Burk        audio_io_handle_t handle,
61062e67a26e0553dd142be622821f493df541f0c6Phil Burk        audio_devices_t devices,
62062e67a26e0553dd142be622821f493df541f0c6Phil Burk        struct audio_config *config,
63062e67a26e0553dd142be622821f493df541f0c6Phil Burk        const char *address)
64062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
65062e67a26e0553dd142be622821f493df541f0c6Phil Burk    audio_stream_out_t* outStream;
66062e67a26e0553dd142be622821f493df541f0c6Phil Burk    int status = hwDev()->open_output_stream(
67062e67a26e0553dd142be622821f493df541f0c6Phil Burk            hwDev(),
68062e67a26e0553dd142be622821f493df541f0c6Phil Burk            handle,
69062e67a26e0553dd142be622821f493df541f0c6Phil Burk            devices,
70062e67a26e0553dd142be622821f493df541f0c6Phil Burk            flags,
71062e67a26e0553dd142be622821f493df541f0c6Phil Burk            config,
72062e67a26e0553dd142be622821f493df541f0c6Phil Burk            &outStream,
73062e67a26e0553dd142be622821f493df541f0c6Phil Burk            address);
74062e67a26e0553dd142be622821f493df541f0c6Phil Burk    ALOGV("AudioStreamOut::open(), HAL open_output_stream returned "
75062e67a26e0553dd142be622821f493df541f0c6Phil Burk            " %p, sampleRate %d, Format %#x, "
76062e67a26e0553dd142be622821f493df541f0c6Phil Burk            "channelMask %#x, status %d",
77062e67a26e0553dd142be622821f493df541f0c6Phil Burk            outStream,
78062e67a26e0553dd142be622821f493df541f0c6Phil Burk            config->sample_rate,
79062e67a26e0553dd142be622821f493df541f0c6Phil Burk            config->format,
80062e67a26e0553dd142be622821f493df541f0c6Phil Burk            config->channel_mask,
81062e67a26e0553dd142be622821f493df541f0c6Phil Burk            status);
82062e67a26e0553dd142be622821f493df541f0c6Phil Burk
83062e67a26e0553dd142be622821f493df541f0c6Phil Burk    if (status == NO_ERROR) {
84062e67a26e0553dd142be622821f493df541f0c6Phil Burk        stream = outStream;
85062e67a26e0553dd142be622821f493df541f0c6Phil Burk    }
86062e67a26e0553dd142be622821f493df541f0c6Phil Burk
87062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return status;
88062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
89062e67a26e0553dd142be622821f493df541f0c6Phil Burk
90062e67a26e0553dd142be622821f493df541f0c6Phil Burksize_t AudioStreamOut::getFrameSize()
91062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
92062e67a26e0553dd142be622821f493df541f0c6Phil Burk    ALOG_ASSERT(stream != NULL);
93062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return audio_stream_out_frame_size(stream);
94062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
95062e67a26e0553dd142be622821f493df541f0c6Phil Burk
96062e67a26e0553dd142be622821f493df541f0c6Phil Burkint AudioStreamOut::flush()
97062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
98062e67a26e0553dd142be622821f493df541f0c6Phil Burk    ALOG_ASSERT(stream != NULL);
99062e67a26e0553dd142be622821f493df541f0c6Phil Burk    if (stream->flush != NULL) {
100062e67a26e0553dd142be622821f493df541f0c6Phil Burk        return stream->flush(stream);
101062e67a26e0553dd142be622821f493df541f0c6Phil Burk    }
102062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return NO_ERROR;
103062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
104062e67a26e0553dd142be622821f493df541f0c6Phil Burk
105062e67a26e0553dd142be622821f493df541f0c6Phil Burkint AudioStreamOut::standby()
106062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
107062e67a26e0553dd142be622821f493df541f0c6Phil Burk    ALOG_ASSERT(stream != NULL);
108062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return stream->common.standby(&stream->common);
109062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
110062e67a26e0553dd142be622821f493df541f0c6Phil Burk
111062e67a26e0553dd142be622821f493df541f0c6Phil Burkssize_t AudioStreamOut::write(const void* buffer, size_t bytes)
112062e67a26e0553dd142be622821f493df541f0c6Phil Burk{
113062e67a26e0553dd142be622821f493df541f0c6Phil Burk    ALOG_ASSERT(stream != NULL);
114062e67a26e0553dd142be622821f493df541f0c6Phil Burk    return stream->write(stream, buffer, bytes);
115062e67a26e0553dd142be622821f493df541f0c6Phil Burk}
116062e67a26e0553dd142be622821f493df541f0c6Phil Burk
117062e67a26e0553dd142be622821f493df541f0c6Phil Burk} // namespace android
118