xref: /aosp_15_r20/frameworks/wilhelm/src/android/AudioTrackCallback.h (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #ifndef SL_PREFETCHEVENT_NONE // This is defined in slesl_allinclusive, which isn't guarded
20 #include "sles_allinclusive.h"
21 #endif
22 
23 #include "media/AudioTrack.h"
24 
25 void audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer*, bool, bool);
26 
27 void audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap);
28 void audioTrack_handleMarker_lockPlay(CAudioPlayer* ap);
29 void audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap);
30 size_t audioTrack_handleMoreData_lockPlay(CAudioPlayer* ap,
31                                         const android::AudioTrack::Buffer& buffer);
32 //--------------------------------------------------------------------------------------------------
33 namespace android {
34 class AudioTrackCallback : public AudioTrack::IAudioTrackCallback {
35   public:
AudioTrackCallback(CAudioPlayer * player)36     AudioTrackCallback(CAudioPlayer * player) : mAp(player),
37             mCallbackProtector(mAp->mCallbackProtector) {}
38 
onMoreData(const AudioTrack::Buffer & buffer)39     size_t onMoreData(const AudioTrack::Buffer& buffer) override {
40         if (!android::CallbackProtector::enterCbIfOk(mCallbackProtector)) {
41           // it is not safe to enter the callback (the track is about to go away)
42           return buffer.size(); // duplicate existing behavior
43         }
44         size_t bytesCopied = audioTrack_handleMoreData_lockPlay(mAp, buffer);
45         mCallbackProtector->exitCb();
46         return bytesCopied;
47       }
48 
onUnderrun()49     void onUnderrun() override {
50         if (!android::CallbackProtector::enterCbIfOk(mCallbackProtector)) {
51           // it is not safe to enter the callback (the track is about to go away)
52             return;
53         }
54         audioTrack_handleUnderrun_lockPlay(mAp);
55         mCallbackProtector->exitCb();
56     }
57 
onLoopEnd(int32_t loopsRemaining)58     void onLoopEnd([[maybe_unused]] int32_t loopsRemaining) override {
59         SL_LOGE("Encountered loop end for CAudioPlayer %p", mAp);
60     }
onMarker(uint32_t markerPosition)61     void onMarker([[maybe_unused]] uint32_t markerPosition) override {
62         if (!android::CallbackProtector::enterCbIfOk(mCallbackProtector)) {
63           // it is not safe to enter the callback (the track is about to go away)
64           return;
65         }
66         audioTrack_handleMarker_lockPlay(mAp);
67         mCallbackProtector->exitCb();
68     }
69 
onNewPos(uint32_t newPos)70     void onNewPos([[maybe_unused]] uint32_t newPos) override {
71         if (!android::CallbackProtector::enterCbIfOk(mCallbackProtector)) {
72           // it is not safe to enter the callback (the track is about to go away)
73           return;
74         }
75         audioTrack_handleNewPos_lockPlay(mAp);
76         mCallbackProtector->exitCb();
77     }
onBufferEnd()78     void onBufferEnd() override {
79         SL_LOGE("Encountered buffer end for CAudioPlayer %p", mAp);
80     }
81     // Ignore
onNewIAudioTrack()82     void onNewIAudioTrack() override {}
onStreamEnd()83     void onStreamEnd() override {
84         SL_LOGE("Encountered buffer end for CAudioPlayer %p", mAp);
85     }
onNewTimestamp(AudioTimestamp timestamp)86     void onNewTimestamp([[maybe_unused]] AudioTimestamp timestamp) {
87         SL_LOGE("Encountered write more data for CAudioPlayer %p", mAp);
88     }
onCanWriteMoreData(const AudioTrack::Buffer & buffer)89     size_t onCanWriteMoreData([[maybe_unused]] const AudioTrack::Buffer& buffer) {
90         SL_LOGE("Encountered write more data for CAudioPlayer %p", mAp);
91         return 0;
92     }
93 
94   private:
95     AudioTrackCallback(const AudioTrackCallback&) = delete;
96     AudioTrackCallback& operator=(const AudioTrackCallback&) = delete;
97     CAudioPlayer* const mAp;
98     const sp<CallbackProtector> mCallbackProtector;
99 };
100 }  // namespace android
101