xref: /aosp_15_r20/frameworks/av/services/audioflinger/datapath/SpdifStreamIn.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  *
3*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2023, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker  *
5*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker  *
9*ec779b8eSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker  *
11*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker  */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #pragma once
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include "AudioStreamIn.h"
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/spdif/SPDIFDecoder.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <afutils/NBAIO_Tee.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker namespace android {
31*ec779b8eSAndroid Build Coastguard Worker 
32*ec779b8eSAndroid Build Coastguard Worker /**
33*ec779b8eSAndroid Build Coastguard Worker  * Stream that is a PCM data burst in the HAL but looks like an encoded stream
34*ec779b8eSAndroid Build Coastguard Worker  * to the AudioFlinger. Wraps encoded data in an SPDIF wrapper per IEC61973-3.
35*ec779b8eSAndroid Build Coastguard Worker  */
36*ec779b8eSAndroid Build Coastguard Worker class SpdifStreamIn : public AudioStreamIn {
37*ec779b8eSAndroid Build Coastguard Worker public:
38*ec779b8eSAndroid Build Coastguard Worker 
39*ec779b8eSAndroid Build Coastguard Worker     SpdifStreamIn(AudioHwDevice *dev, audio_input_flags_t flags,
40*ec779b8eSAndroid Build Coastguard Worker             audio_format_t format);
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker     status_t open(
43*ec779b8eSAndroid Build Coastguard Worker             audio_io_handle_t handle,
44*ec779b8eSAndroid Build Coastguard Worker             audio_devices_t devices,
45*ec779b8eSAndroid Build Coastguard Worker             struct audio_config *config,
46*ec779b8eSAndroid Build Coastguard Worker             const char *address,
47*ec779b8eSAndroid Build Coastguard Worker             audio_source_t source,
48*ec779b8eSAndroid Build Coastguard Worker             audio_devices_t outputDevice,
49*ec779b8eSAndroid Build Coastguard Worker             const char* outputDeviceAddress) override;
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     /**
52*ec779b8eSAndroid Build Coastguard Worker     * Read audio buffer from driver. If at least one frame was read successfully prior to the error,
53*ec779b8eSAndroid Build Coastguard Worker     * it is suggested that the driver return that successful (short) byte count
54*ec779b8eSAndroid Build Coastguard Worker     * and then return an error in the subsequent call.
55*ec779b8eSAndroid Build Coastguard Worker     *
56*ec779b8eSAndroid Build Coastguard Worker     * If set_callback() has previously been called to enable non-blocking mode
57*ec779b8eSAndroid Build Coastguard Worker     * the write() is not allowed to block. It must write only the number of
58*ec779b8eSAndroid Build Coastguard Worker     * bytes that currently fit in the driver/hardware buffer and then return
59*ec779b8eSAndroid Build Coastguard Worker     * this byte count. If this is less than the requested write size the
60*ec779b8eSAndroid Build Coastguard Worker     * callback function must be called when more space is available in the
61*ec779b8eSAndroid Build Coastguard Worker     * driver/hardware buffer.
62*ec779b8eSAndroid Build Coastguard Worker     */
63*ec779b8eSAndroid Build Coastguard Worker     status_t read(void* buffer, size_t bytes, size_t* read) override;
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     /**
66*ec779b8eSAndroid Build Coastguard Worker      * @return frame size from the perspective of the application and the AudioFlinger.
67*ec779b8eSAndroid Build Coastguard Worker      */
getFrameSize()68*ec779b8eSAndroid Build Coastguard Worker     [[nodiscard]] size_t getFrameSize() const override { return sizeof(int8_t); }
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker     /**
71*ec779b8eSAndroid Build Coastguard Worker      * @return audio_config_base_t from the perspective of the application and the AudioFlinger.
72*ec779b8eSAndroid Build Coastguard Worker      */
getAudioProperties()73*ec779b8eSAndroid Build Coastguard Worker     [[nodiscard]] audio_config_base_t getAudioProperties() const override {
74*ec779b8eSAndroid Build Coastguard Worker         return mApplicationConfig;
75*ec779b8eSAndroid Build Coastguard Worker     }
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     /**
78*ec779b8eSAndroid Build Coastguard Worker      * @return format from the perspective of the application and the AudioFlinger.
79*ec779b8eSAndroid Build Coastguard Worker      */
getFormat()80*ec779b8eSAndroid Build Coastguard Worker     [[nodiscard]] virtual audio_format_t getFormat() const { return mApplicationConfig.format; }
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     /**
83*ec779b8eSAndroid Build Coastguard Worker      * The HAL may be running at a higher sample rate if, for example, reading wrapped EAC3.
84*ec779b8eSAndroid Build Coastguard Worker      * @return sample rate from the perspective of the application and the AudioFlinger.
85*ec779b8eSAndroid Build Coastguard Worker      */
getSampleRate()86*ec779b8eSAndroid Build Coastguard Worker     [[nodiscard]] virtual uint32_t getSampleRate() const { return mApplicationConfig.sample_rate; }
87*ec779b8eSAndroid Build Coastguard Worker 
88*ec779b8eSAndroid Build Coastguard Worker     /**
89*ec779b8eSAndroid Build Coastguard Worker      * The HAL is in stereo mode when reading multi-channel compressed audio.
90*ec779b8eSAndroid Build Coastguard Worker      * @return channel mask from the perspective of the application and the AudioFlinger.
91*ec779b8eSAndroid Build Coastguard Worker      */
getChannelMask()92*ec779b8eSAndroid Build Coastguard Worker     [[nodiscard]] virtual audio_channel_mask_t getChannelMask() const {
93*ec779b8eSAndroid Build Coastguard Worker         return mApplicationConfig.channel_mask;
94*ec779b8eSAndroid Build Coastguard Worker     }
95*ec779b8eSAndroid Build Coastguard Worker 
96*ec779b8eSAndroid Build Coastguard Worker     status_t standby() override;
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker private:
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker     class MySPDIFDecoder : public SPDIFDecoder
101*ec779b8eSAndroid Build Coastguard Worker     {
102*ec779b8eSAndroid Build Coastguard Worker     public:
MySPDIFDecoder(SpdifStreamIn * spdifStreamIn,audio_format_t format)103*ec779b8eSAndroid Build Coastguard Worker         MySPDIFDecoder(SpdifStreamIn *spdifStreamIn, audio_format_t format)
104*ec779b8eSAndroid Build Coastguard Worker           :  SPDIFDecoder(format)
105*ec779b8eSAndroid Build Coastguard Worker           , mSpdifStreamIn(spdifStreamIn)
106*ec779b8eSAndroid Build Coastguard Worker         {
107*ec779b8eSAndroid Build Coastguard Worker         }
108*ec779b8eSAndroid Build Coastguard Worker 
readInput(void * buffer,size_t bytes)109*ec779b8eSAndroid Build Coastguard Worker         ssize_t readInput(void* buffer, size_t bytes) override
110*ec779b8eSAndroid Build Coastguard Worker         {
111*ec779b8eSAndroid Build Coastguard Worker             size_t bytesRead = 0;
112*ec779b8eSAndroid Build Coastguard Worker             const auto result = mSpdifStreamIn->readDataBurst(buffer, bytes, &bytesRead);
113*ec779b8eSAndroid Build Coastguard Worker             if (result < 0) {
114*ec779b8eSAndroid Build Coastguard Worker                 return result;
115*ec779b8eSAndroid Build Coastguard Worker             }
116*ec779b8eSAndroid Build Coastguard Worker             return bytesRead;
117*ec779b8eSAndroid Build Coastguard Worker         }
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker     protected:
120*ec779b8eSAndroid Build Coastguard Worker         SpdifStreamIn * const mSpdifStreamIn;
121*ec779b8eSAndroid Build Coastguard Worker     };
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     MySPDIFDecoder mSpdifDecoder;
124*ec779b8eSAndroid Build Coastguard Worker     audio_config_base_t mApplicationConfig = AUDIO_CONFIG_BASE_INITIALIZER;
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker     status_t readDataBurst(void* data, size_t bytes, size_t* read);
127*ec779b8eSAndroid Build Coastguard Worker 
128*ec779b8eSAndroid Build Coastguard Worker #ifdef TEE_SINK
129*ec779b8eSAndroid Build Coastguard Worker     NBAIO_Tee mTee;
130*ec779b8eSAndroid Build Coastguard Worker #endif
131*ec779b8eSAndroid Build Coastguard Worker 
132*ec779b8eSAndroid Build Coastguard Worker };
133*ec779b8eSAndroid Build Coastguard Worker 
134*ec779b8eSAndroid Build Coastguard Worker } // namespace android
135