AudioStreamOut.h 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#ifndef ANDROID_AUDIO_STREAM_OUT_H
19062e67a26e0553dd142be622821f493df541f0c6Phil Burk#define ANDROID_AUDIO_STREAM_OUT_H
20062e67a26e0553dd142be622821f493df541f0c6Phil Burk
21062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <stdint.h>
22062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <sys/types.h>
23062e67a26e0553dd142be622821f493df541f0c6Phil Burk
24062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <system/audio.h>
25062e67a26e0553dd142be622821f493df541f0c6Phil Burk
26062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include "AudioStreamOut.h"
27062e67a26e0553dd142be622821f493df541f0c6Phil Burk
28062e67a26e0553dd142be622821f493df541f0c6Phil Burknamespace android {
29062e67a26e0553dd142be622821f493df541f0c6Phil Burk
30062e67a26e0553dd142be622821f493df541f0c6Phil Burkclass AudioHwDevice;
31062e67a26e0553dd142be622821f493df541f0c6Phil Burk
32062e67a26e0553dd142be622821f493df541f0c6Phil Burk/**
33062e67a26e0553dd142be622821f493df541f0c6Phil Burk * Managed access to a HAL output stream.
34062e67a26e0553dd142be622821f493df541f0c6Phil Burk */
35062e67a26e0553dd142be622821f493df541f0c6Phil Burkclass AudioStreamOut {
36062e67a26e0553dd142be622821f493df541f0c6Phil Burkpublic:
37062e67a26e0553dd142be622821f493df541f0c6Phil Burk// AudioStreamOut is immutable, so its fields are const.
38062e67a26e0553dd142be622821f493df541f0c6Phil Burk// For emphasis, we could also make all pointers to them be "const *",
39062e67a26e0553dd142be622821f493df541f0c6Phil Burk// but that would clutter the code unnecessarily.
40062e67a26e0553dd142be622821f493df541f0c6Phil Burk    AudioHwDevice * const audioHwDev;
41062e67a26e0553dd142be622821f493df541f0c6Phil Burk    audio_stream_out_t *stream;
42062e67a26e0553dd142be622821f493df541f0c6Phil Burk    const audio_output_flags_t flags;
43062e67a26e0553dd142be622821f493df541f0c6Phil Burk
44062e67a26e0553dd142be622821f493df541f0c6Phil Burk    audio_hw_device_t *hwDev() const;
45062e67a26e0553dd142be622821f493df541f0c6Phil Burk
46062e67a26e0553dd142be622821f493df541f0c6Phil Burk    AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags);
47062e67a26e0553dd142be622821f493df541f0c6Phil Burk
48062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual status_t open(
49062e67a26e0553dd142be622821f493df541f0c6Phil Burk            audio_io_handle_t handle,
50062e67a26e0553dd142be622821f493df541f0c6Phil Burk            audio_devices_t devices,
51062e67a26e0553dd142be622821f493df541f0c6Phil Burk            struct audio_config *config,
52062e67a26e0553dd142be622821f493df541f0c6Phil Burk            const char *address);
53062e67a26e0553dd142be622821f493df541f0c6Phil Burk
54062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual ~AudioStreamOut() { }
55062e67a26e0553dd142be622821f493df541f0c6Phil Burk
56062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual status_t getRenderPosition(uint32_t *frames);
57062e67a26e0553dd142be622821f493df541f0c6Phil Burk
58062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp);
59062e67a26e0553dd142be622821f493df541f0c6Phil Burk
60062e67a26e0553dd142be622821f493df541f0c6Phil Burk    /**
61062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * Write audio buffer to driver. Returns number of bytes written, or a
62062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * negative status_t. If at least one frame was written successfully prior to the error,
63062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * it is suggested that the driver return that successful (short) byte count
64062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * and then return an error in the subsequent call.
65062e67a26e0553dd142be622821f493df541f0c6Phil Burk    *
66062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * If set_callback() has previously been called to enable non-blocking mode
67062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * the write() is not allowed to block. It must write only the number of
68062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * bytes that currently fit in the driver/hardware buffer and then return
69062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * this byte count. If this is less than the requested write size the
70062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * callback function must be called when more space is available in the
71062e67a26e0553dd142be622821f493df541f0c6Phil Burk    * driver/hardware buffer.
72062e67a26e0553dd142be622821f493df541f0c6Phil Burk    */
73062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual ssize_t write(const void *buffer, size_t bytes);
74062e67a26e0553dd142be622821f493df541f0c6Phil Burk
75062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual size_t getFrameSize();
76062e67a26e0553dd142be622821f493df541f0c6Phil Burk
77062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual status_t flush();
78062e67a26e0553dd142be622821f493df541f0c6Phil Burk    virtual status_t standby();
79062e67a26e0553dd142be622821f493df541f0c6Phil Burk};
80062e67a26e0553dd142be622821f493df541f0c6Phil Burk
81062e67a26e0553dd142be622821f493df541f0c6Phil Burk} // namespace android
82062e67a26e0553dd142be622821f493df541f0c6Phil Burk
83062e67a26e0553dd142be622821f493df541f0c6Phil Burk#endif // ANDROID_AUDIO_STREAM_OUT_H
84