1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, 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 #ifndef ANDROID_MEDIAPLAYERSERVICE_H 19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIAPLAYERSERVICE_H 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <arpa/inet.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <string> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h> 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversion.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioContainers.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioResamplerPublic.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioSystem.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioTrack.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaPlayerInterface.h> 36*ec779b8eSAndroid Build Coastguard Worker #include <media/Metadata.h> 37*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ABase.h> 38*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/Synchronization.h> 39*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h> 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker namespace android { 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState; 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker struct AVSyncSettings; 48*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier; 49*ec779b8eSAndroid Build Coastguard Worker class IDataSource; 50*ec779b8eSAndroid Build Coastguard Worker class IMediaRecorder; 51*ec779b8eSAndroid Build Coastguard Worker class IMediaMetadataRetriever; 52*ec779b8eSAndroid Build Coastguard Worker class IRemoteDisplay; 53*ec779b8eSAndroid Build Coastguard Worker class IRemoteDisplayClient; 54*ec779b8eSAndroid Build Coastguard Worker class MediaRecorderClient; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker #define CALLBACK_ANTAGONIZER 0 57*ec779b8eSAndroid Build Coastguard Worker #if CALLBACK_ANTAGONIZER 58*ec779b8eSAndroid Build Coastguard Worker class Antagonizer { 59*ec779b8eSAndroid Build Coastguard Worker public: 60*ec779b8eSAndroid Build Coastguard Worker Antagonizer(const sp<MediaPlayerBase::Listener> &listener); start()61*ec779b8eSAndroid Build Coastguard Worker void start() { mActive = true; } stop()62*ec779b8eSAndroid Build Coastguard Worker void stop() { mActive = false; } 63*ec779b8eSAndroid Build Coastguard Worker void kill(); 64*ec779b8eSAndroid Build Coastguard Worker private: 65*ec779b8eSAndroid Build Coastguard Worker static const int interval; 66*ec779b8eSAndroid Build Coastguard Worker Antagonizer(); 67*ec779b8eSAndroid Build Coastguard Worker static int callbackThread(void* cookie); 68*ec779b8eSAndroid Build Coastguard Worker Mutex mLock; 69*ec779b8eSAndroid Build Coastguard Worker Condition mCondition; 70*ec779b8eSAndroid Build Coastguard Worker bool mExit; 71*ec779b8eSAndroid Build Coastguard Worker bool mActive; 72*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase::Listener> mListener; 73*ec779b8eSAndroid Build Coastguard Worker }; 74*ec779b8eSAndroid Build Coastguard Worker #endif 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker class MediaPlayerService : public BnMediaPlayerService 77*ec779b8eSAndroid Build Coastguard Worker { 78*ec779b8eSAndroid Build Coastguard Worker class Client; 79*ec779b8eSAndroid Build Coastguard Worker 80*ec779b8eSAndroid Build Coastguard Worker class AudioOutput : public MediaPlayerBase::AudioSink 81*ec779b8eSAndroid Build Coastguard Worker { 82*ec779b8eSAndroid Build Coastguard Worker class CallbackData; 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker public: 85*ec779b8eSAndroid Build Coastguard Worker AudioOutput( 86*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 87*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 88*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t * attr, 89*ec779b8eSAndroid Build Coastguard Worker const sp<AudioSystem::AudioDeviceCallback>& deviceCallback); 90*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioOutput(); 91*ec779b8eSAndroid Build Coastguard Worker ready()92*ec779b8eSAndroid Build Coastguard Worker virtual bool ready() const { return mTrack != 0; } 93*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t bufferSize() const; 94*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t frameCount() const; 95*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t channelCount() const; 96*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t frameSize() const; 97*ec779b8eSAndroid Build Coastguard Worker virtual uint32_t latency() const; 98*ec779b8eSAndroid Build Coastguard Worker virtual float msecsPerFrame() const; 99*ec779b8eSAndroid Build Coastguard Worker virtual status_t getPosition(uint32_t *position) const; 100*ec779b8eSAndroid Build Coastguard Worker virtual status_t getTimestamp(AudioTimestamp &ts) const; 101*ec779b8eSAndroid Build Coastguard Worker virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const; 102*ec779b8eSAndroid Build Coastguard Worker virtual status_t getFramesWritten(uint32_t *frameswritten) const; 103*ec779b8eSAndroid Build Coastguard Worker virtual audio_session_t getSessionId() const; 104*ec779b8eSAndroid Build Coastguard Worker virtual uint32_t getSampleRate() const; 105*ec779b8eSAndroid Build Coastguard Worker virtual int64_t getBufferDurationInUs() const; getFlags()106*ec779b8eSAndroid Build Coastguard Worker virtual audio_output_flags_t getFlags() const { return mFlags; } 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker status_t open( 109*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 110*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, int bufferCount, 111*ec779b8eSAndroid Build Coastguard Worker AudioCallback cb, const wp<RefBase>& cookie, 112*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, 113*ec779b8eSAndroid Build Coastguard Worker const audio_offload_info_t *offloadInfo = NULL, 114*ec779b8eSAndroid Build Coastguard Worker bool doNotReconnect = false, 115*ec779b8eSAndroid Build Coastguard Worker uint32_t suggestedFrameCount = 0) override; 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker virtual void setPlayerIId(int32_t playerIId); 118*ec779b8eSAndroid Build Coastguard Worker 119*ec779b8eSAndroid Build Coastguard Worker virtual status_t start(); 120*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t write(const void* buffer, size_t size, bool blocking = true); 121*ec779b8eSAndroid Build Coastguard Worker virtual void stop(); 122*ec779b8eSAndroid Build Coastguard Worker virtual void flush(); 123*ec779b8eSAndroid Build Coastguard Worker virtual void pause(); 124*ec779b8eSAndroid Build Coastguard Worker virtual void close(); 125*ec779b8eSAndroid Build Coastguard Worker void setAudioStreamType(audio_stream_type_t streamType); getAudioStreamType()126*ec779b8eSAndroid Build Coastguard Worker virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; } 127*ec779b8eSAndroid Build Coastguard Worker void setAudioAttributes(const audio_attributes_t * attributes); 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker void setVolume(float left, float right); 130*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPlaybackRate(const AudioPlaybackRate& rate); 131*ec779b8eSAndroid Build Coastguard Worker virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker status_t setAuxEffectSendLevel(float level); 134*ec779b8eSAndroid Build Coastguard Worker status_t attachAuxEffect(int effectId); 135*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args) const; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker static bool isOnEmulator(); 138*ec779b8eSAndroid Build Coastguard Worker static int getMinBufferCount(); 139*ec779b8eSAndroid Build Coastguard Worker void setNextOutput(const sp<AudioOutput>& nextOutput); 140*ec779b8eSAndroid Build Coastguard Worker void switchToNextOutput(); needsTrailingPadding()141*ec779b8eSAndroid Build Coastguard Worker virtual bool needsTrailingPadding() { return mNextOutput == NULL; } 142*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameters(const String8& keyValuePairs); 143*ec779b8eSAndroid Build Coastguard Worker virtual String8 getParameters(const String8& keys); 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker virtual media::VolumeShaper::Status applyVolumeShaper( 146*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Configuration>& configuration, 147*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Operation>& operation) override; 148*ec779b8eSAndroid Build Coastguard Worker virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override; 149*ec779b8eSAndroid Build Coastguard Worker 150*ec779b8eSAndroid Build Coastguard Worker // AudioRouting 151*ec779b8eSAndroid Build Coastguard Worker virtual status_t setOutputDevice(audio_port_handle_t deviceId); 152*ec779b8eSAndroid Build Coastguard Worker virtual status_t getRoutedDeviceIds(DeviceIdVector& deviceIds); 153*ec779b8eSAndroid Build Coastguard Worker virtual status_t enableAudioDeviceCallback(bool enabled); 154*ec779b8eSAndroid Build Coastguard Worker 155*ec779b8eSAndroid Build Coastguard Worker private: 156*ec779b8eSAndroid Build Coastguard Worker static void setMinBufferCount(); 157*ec779b8eSAndroid Build Coastguard Worker static void CallbackWrapper( 158*ec779b8eSAndroid Build Coastguard Worker int event, void *me, void *info); 159*ec779b8eSAndroid Build Coastguard Worker void deleteRecycledTrack_l(); 160*ec779b8eSAndroid Build Coastguard Worker void close_l(); 161*ec779b8eSAndroid Build Coastguard Worker status_t updateTrack(); 162*ec779b8eSAndroid Build Coastguard Worker 163*ec779b8eSAndroid Build Coastguard Worker sp<AudioTrack> mTrack; 164*ec779b8eSAndroid Build Coastguard Worker sp<AudioTrack> mRecycledTrack; 165*ec779b8eSAndroid Build Coastguard Worker sp<AudioOutput> mNextOutput; 166*ec779b8eSAndroid Build Coastguard Worker int mCachedPlayerIId; 167*ec779b8eSAndroid Build Coastguard Worker AudioCallback mCallback; 168*ec779b8eSAndroid Build Coastguard Worker wp<RefBase> mCallbackCookie; 169*ec779b8eSAndroid Build Coastguard Worker sp<CallbackData> mCallbackData; 170*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t mStreamType; 171*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t * mAttributes; 172*ec779b8eSAndroid Build Coastguard Worker float mLeftVolume; 173*ec779b8eSAndroid Build Coastguard Worker float mRightVolume; 174*ec779b8eSAndroid Build Coastguard Worker AudioPlaybackRate mPlaybackRate; 175*ec779b8eSAndroid Build Coastguard Worker uint32_t mSampleRateHz; // sample rate of the content, as set in open() 176*ec779b8eSAndroid Build Coastguard Worker float mMsecsPerFrame; 177*ec779b8eSAndroid Build Coastguard Worker size_t mFrameSize; 178*ec779b8eSAndroid Build Coastguard Worker audio_session_t mSessionId; 179*ec779b8eSAndroid Build Coastguard Worker AttributionSourceState mAttributionSource; 180*ec779b8eSAndroid Build Coastguard Worker float mSendLevel; 181*ec779b8eSAndroid Build Coastguard Worker int mAuxEffectId; 182*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t mFlags; 183*ec779b8eSAndroid Build Coastguard Worker sp<media::VolumeHandler> mVolumeHandler; 184*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t mSelectedDeviceId; 185*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector mRoutedDeviceIds; 186*ec779b8eSAndroid Build Coastguard Worker bool mDeviceCallbackEnabled; 187*ec779b8eSAndroid Build Coastguard Worker wp<AudioSystem::AudioDeviceCallback> mDeviceCallback; 188*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock; 189*ec779b8eSAndroid Build Coastguard Worker 190*ec779b8eSAndroid Build Coastguard Worker // static variables below not protected by mutex 191*ec779b8eSAndroid Build Coastguard Worker static bool mIsOnEmulator; 192*ec779b8eSAndroid Build Coastguard Worker static int mMinBufferCount; // 12 for emulator; otherwise 4 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker // CallbackData is what is passed to the AudioTrack as the "user" data. 195*ec779b8eSAndroid Build Coastguard Worker // We need to be able to target this to a different Output on the fly, 196*ec779b8eSAndroid Build Coastguard Worker // so we can't use the Output itself for this. 197*ec779b8eSAndroid Build Coastguard Worker class CallbackData : public AudioTrack::IAudioTrackCallback { 198*ec779b8eSAndroid Build Coastguard Worker friend AudioOutput; 199*ec779b8eSAndroid Build Coastguard Worker public: CallbackData(const wp<AudioOutput> & cookie)200*ec779b8eSAndroid Build Coastguard Worker explicit CallbackData(const wp<AudioOutput>& cookie) { 201*ec779b8eSAndroid Build Coastguard Worker mData = cookie; 202*ec779b8eSAndroid Build Coastguard Worker mSwitching = false; 203*ec779b8eSAndroid Build Coastguard Worker } getOutput()204*ec779b8eSAndroid Build Coastguard Worker sp<AudioOutput> getOutput() const { return mData.load().promote(); } setOutput(const wp<AudioOutput> & newcookie)205*ec779b8eSAndroid Build Coastguard Worker void setOutput(const wp<AudioOutput>& newcookie) { mData.store(newcookie); } 206*ec779b8eSAndroid Build Coastguard Worker // lock/unlock are used by the callback before accessing the payload of this object lock()207*ec779b8eSAndroid Build Coastguard Worker void lock() const { mLock.lock(); } unlock()208*ec779b8eSAndroid Build Coastguard Worker void unlock() const { mLock.unlock(); } 209*ec779b8eSAndroid Build Coastguard Worker 210*ec779b8eSAndroid Build Coastguard Worker // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over 211*ec779b8eSAndroid Build Coastguard Worker // to the next sink. 212*ec779b8eSAndroid Build Coastguard Worker 213*ec779b8eSAndroid Build Coastguard Worker // tryBeginTrackSwitch() returns true only if it obtains the lock. tryBeginTrackSwitch()214*ec779b8eSAndroid Build Coastguard Worker bool tryBeginTrackSwitch() { 215*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called"); 216*ec779b8eSAndroid Build Coastguard Worker if (mLock.tryLock() != OK) { 217*ec779b8eSAndroid Build Coastguard Worker return false; 218*ec779b8eSAndroid Build Coastguard Worker } 219*ec779b8eSAndroid Build Coastguard Worker mSwitching = true; 220*ec779b8eSAndroid Build Coastguard Worker return true; 221*ec779b8eSAndroid Build Coastguard Worker } endTrackSwitch()222*ec779b8eSAndroid Build Coastguard Worker void endTrackSwitch() { 223*ec779b8eSAndroid Build Coastguard Worker if (mSwitching) { 224*ec779b8eSAndroid Build Coastguard Worker mLock.unlock(); 225*ec779b8eSAndroid Build Coastguard Worker } 226*ec779b8eSAndroid Build Coastguard Worker mSwitching = false; 227*ec779b8eSAndroid Build Coastguard Worker } 228*ec779b8eSAndroid Build Coastguard Worker protected: 229*ec779b8eSAndroid Build Coastguard Worker size_t onMoreData(const AudioTrack::Buffer& buffer) override; 230*ec779b8eSAndroid Build Coastguard Worker void onUnderrun() override; 231*ec779b8eSAndroid Build Coastguard Worker void onStreamEnd() override; 232*ec779b8eSAndroid Build Coastguard Worker void onNewIAudioTrack() override; 233*ec779b8eSAndroid Build Coastguard Worker private: 234*ec779b8eSAndroid Build Coastguard Worker mediautils::atomic_wp<AudioOutput> mData; 235*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock; // a recursive mutex might make this unnecessary. 236*ec779b8eSAndroid Build Coastguard Worker bool mSwitching; 237*ec779b8eSAndroid Build Coastguard Worker DISALLOW_EVIL_CONSTRUCTORS(CallbackData); 238*ec779b8eSAndroid Build Coastguard Worker }; 239*ec779b8eSAndroid Build Coastguard Worker 240*ec779b8eSAndroid Build Coastguard Worker }; // AudioOutput 241*ec779b8eSAndroid Build Coastguard Worker 242*ec779b8eSAndroid Build Coastguard Worker public: 243*ec779b8eSAndroid Build Coastguard Worker static void instantiate(); 244*ec779b8eSAndroid Build Coastguard Worker 245*ec779b8eSAndroid Build Coastguard Worker // IMediaPlayerService interface 246*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaRecorder> createMediaRecorder(const AttributionSourceState &attributionSource); 247*ec779b8eSAndroid Build Coastguard Worker void removeMediaRecorderClient(const wp<MediaRecorderClient>& client); 248*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaMetadataRetriever> createMetadataRetriever(); 249*ec779b8eSAndroid Build Coastguard Worker 250*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client, 251*ec779b8eSAndroid Build Coastguard Worker audio_session_t audioSessionId, 252*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource); 253*ec779b8eSAndroid Build Coastguard Worker 254*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMediaCodecList> getCodecList() const; 255*ec779b8eSAndroid Build Coastguard Worker 256*ec779b8eSAndroid Build Coastguard Worker virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName, 257*ec779b8eSAndroid Build Coastguard Worker const sp<IRemoteDisplayClient>& client, const String8& iface); 258*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 259*ec779b8eSAndroid Build Coastguard Worker 260*ec779b8eSAndroid Build Coastguard Worker void removeClient(const wp<Client>& client); 261*ec779b8eSAndroid Build Coastguard Worker bool hasClient(wp<Client> client); 262*ec779b8eSAndroid Build Coastguard Worker 263*ec779b8eSAndroid Build Coastguard Worker enum { 264*ec779b8eSAndroid Build Coastguard Worker MEDIASERVER_PROCESS_DEATH = 0, 265*ec779b8eSAndroid Build Coastguard Worker MEDIAEXTRACTOR_PROCESS_DEATH = 1, 266*ec779b8eSAndroid Build Coastguard Worker MEDIACODEC_PROCESS_DEATH = 2, 267*ec779b8eSAndroid Build Coastguard Worker AUDIO_PROCESS_DEATH = 3, // currently no need to track this 268*ec779b8eSAndroid Build Coastguard Worker CAMERA_PROCESS_DEATH = 4 269*ec779b8eSAndroid Build Coastguard Worker }; 270*ec779b8eSAndroid Build Coastguard Worker 271*ec779b8eSAndroid Build Coastguard Worker // Collect info of the codec usage from media player and media recorder 272*ec779b8eSAndroid Build Coastguard Worker virtual void addBatteryData(uint32_t params); 273*ec779b8eSAndroid Build Coastguard Worker // API for the Battery app to pull the data of codecs usage 274*ec779b8eSAndroid Build Coastguard Worker virtual status_t pullBatteryData(Parcel* reply); 275*ec779b8eSAndroid Build Coastguard Worker private: 276*ec779b8eSAndroid Build Coastguard Worker struct BatteryTracker { 277*ec779b8eSAndroid Build Coastguard Worker BatteryTracker(); 278*ec779b8eSAndroid Build Coastguard Worker // Collect info of the codec usage from media player and media recorder 279*ec779b8eSAndroid Build Coastguard Worker void addBatteryData(uint32_t params); 280*ec779b8eSAndroid Build Coastguard Worker // API for the Battery app to pull the data of codecs usage 281*ec779b8eSAndroid Build Coastguard Worker status_t pullBatteryData(Parcel* reply); 282*ec779b8eSAndroid Build Coastguard Worker 283*ec779b8eSAndroid Build Coastguard Worker private: 284*ec779b8eSAndroid Build Coastguard Worker // For battery usage tracking purpose 285*ec779b8eSAndroid Build Coastguard Worker struct BatteryUsageInfo { 286*ec779b8eSAndroid Build Coastguard Worker // how many streams are being played by one UID 287*ec779b8eSAndroid Build Coastguard Worker int refCount; 288*ec779b8eSAndroid Build Coastguard Worker // a temp variable to store the duration(ms) of audio codecs 289*ec779b8eSAndroid Build Coastguard Worker // when we start a audio codec, we minus the system time from audioLastTime 290*ec779b8eSAndroid Build Coastguard Worker // when we pause it, we add the system time back to the audioLastTime 291*ec779b8eSAndroid Build Coastguard Worker // so after the pause, audioLastTime = pause time - start time 292*ec779b8eSAndroid Build Coastguard Worker // if multiple audio streams are played (or recorded), then audioLastTime 293*ec779b8eSAndroid Build Coastguard Worker // = the total playing time of all the streams 294*ec779b8eSAndroid Build Coastguard Worker int32_t audioLastTime; 295*ec779b8eSAndroid Build Coastguard Worker // when all the audio streams are being paused, we assign audioLastTime to 296*ec779b8eSAndroid Build Coastguard Worker // this variable, so this value could be provided to the battery app 297*ec779b8eSAndroid Build Coastguard Worker // in the next pullBatteryData call 298*ec779b8eSAndroid Build Coastguard Worker int32_t audioTotalTime; 299*ec779b8eSAndroid Build Coastguard Worker 300*ec779b8eSAndroid Build Coastguard Worker int32_t videoLastTime; 301*ec779b8eSAndroid Build Coastguard Worker int32_t videoTotalTime; 302*ec779b8eSAndroid Build Coastguard Worker }; 303*ec779b8eSAndroid Build Coastguard Worker KeyedVector<int, BatteryUsageInfo> mBatteryData; 304*ec779b8eSAndroid Build Coastguard Worker 305*ec779b8eSAndroid Build Coastguard Worker enum { 306*ec779b8eSAndroid Build Coastguard Worker SPEAKER, 307*ec779b8eSAndroid Build Coastguard Worker OTHER_AUDIO_DEVICE, 308*ec779b8eSAndroid Build Coastguard Worker SPEAKER_AND_OTHER, 309*ec779b8eSAndroid Build Coastguard Worker NUM_AUDIO_DEVICES 310*ec779b8eSAndroid Build Coastguard Worker }; 311*ec779b8eSAndroid Build Coastguard Worker 312*ec779b8eSAndroid Build Coastguard Worker struct BatteryAudioFlingerUsageInfo { 313*ec779b8eSAndroid Build Coastguard Worker int refCount; // how many audio streams are being played 314*ec779b8eSAndroid Build Coastguard Worker int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used 315*ec779b8eSAndroid Build Coastguard Worker int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms 316*ec779b8eSAndroid Build Coastguard Worker // totalTime[]: total time of audio output devices usage 317*ec779b8eSAndroid Build Coastguard Worker int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms 318*ec779b8eSAndroid Build Coastguard Worker }; 319*ec779b8eSAndroid Build Coastguard Worker 320*ec779b8eSAndroid Build Coastguard Worker // This varialble is used to record the usage of audio output device 321*ec779b8eSAndroid Build Coastguard Worker // for battery app 322*ec779b8eSAndroid Build Coastguard Worker BatteryAudioFlingerUsageInfo mBatteryAudio; 323*ec779b8eSAndroid Build Coastguard Worker 324*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock; 325*ec779b8eSAndroid Build Coastguard Worker }; 326*ec779b8eSAndroid Build Coastguard Worker BatteryTracker mBatteryTracker; 327*ec779b8eSAndroid Build Coastguard Worker 328*ec779b8eSAndroid Build Coastguard Worker class Client : public BnMediaPlayer { 329*ec779b8eSAndroid Build Coastguard Worker // IMediaPlayer interface 330*ec779b8eSAndroid Build Coastguard Worker virtual void disconnect(); 331*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVideoSurfaceTexture( 332*ec779b8eSAndroid Build Coastguard Worker const sp<IGraphicBufferProducer>& bufferProducer); 333*ec779b8eSAndroid Build Coastguard Worker virtual status_t setBufferingSettings(const BufferingSettings& buffering) override; 334*ec779b8eSAndroid Build Coastguard Worker virtual status_t getBufferingSettings( 335*ec779b8eSAndroid Build Coastguard Worker BufferingSettings* buffering /* nonnull */) override; 336*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepareAsync(); 337*ec779b8eSAndroid Build Coastguard Worker virtual status_t start(); 338*ec779b8eSAndroid Build Coastguard Worker virtual status_t stop(); 339*ec779b8eSAndroid Build Coastguard Worker virtual status_t pause(); 340*ec779b8eSAndroid Build Coastguard Worker virtual status_t isPlaying(bool* state); 341*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate); 342*ec779b8eSAndroid Build Coastguard Worker virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */); 343*ec779b8eSAndroid Build Coastguard Worker virtual status_t setSyncSettings(const AVSyncSettings& rate, float videoFpsHint); 344*ec779b8eSAndroid Build Coastguard Worker virtual status_t getSyncSettings(AVSyncSettings* rate /* nonnull */, 345*ec779b8eSAndroid Build Coastguard Worker float* videoFps /* nonnull */); 346*ec779b8eSAndroid Build Coastguard Worker virtual status_t seekTo( 347*ec779b8eSAndroid Build Coastguard Worker int msec, 348*ec779b8eSAndroid Build Coastguard Worker MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC); 349*ec779b8eSAndroid Build Coastguard Worker virtual status_t getCurrentPosition(int* msec); 350*ec779b8eSAndroid Build Coastguard Worker virtual status_t getDuration(int* msec); 351*ec779b8eSAndroid Build Coastguard Worker virtual status_t reset(); 352*ec779b8eSAndroid Build Coastguard Worker virtual status_t notifyAt(int64_t mediaTimeUs); 353*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAudioStreamType(audio_stream_type_t type); 354*ec779b8eSAndroid Build Coastguard Worker virtual status_t setLooping(int loop); 355*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVolume(float leftVolume, float rightVolume); 356*ec779b8eSAndroid Build Coastguard Worker virtual status_t invoke(const Parcel& request, Parcel *reply); 357*ec779b8eSAndroid Build Coastguard Worker virtual status_t setMetadataFilter(const Parcel& filter); 358*ec779b8eSAndroid Build Coastguard Worker virtual status_t getMetadata(bool update_only, 359*ec779b8eSAndroid Build Coastguard Worker bool apply_filter, 360*ec779b8eSAndroid Build Coastguard Worker Parcel *reply); 361*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAuxEffectSendLevel(float level); 362*ec779b8eSAndroid Build Coastguard Worker virtual status_t attachAuxEffect(int effectId); 363*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameter(int key, const Parcel &request); 364*ec779b8eSAndroid Build Coastguard Worker virtual status_t getParameter(int key, Parcel *reply); 365*ec779b8eSAndroid Build Coastguard Worker virtual status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint); 366*ec779b8eSAndroid Build Coastguard Worker virtual status_t getRetransmitEndpoint(struct sockaddr_in* endpoint); 367*ec779b8eSAndroid Build Coastguard Worker virtual status_t setNextPlayer(const sp<IMediaPlayer>& player); 368*ec779b8eSAndroid Build Coastguard Worker 369*ec779b8eSAndroid Build Coastguard Worker virtual media::VolumeShaper::Status applyVolumeShaper( 370*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Configuration>& configuration, 371*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Operation>& operation) override; 372*ec779b8eSAndroid Build Coastguard Worker virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override; 373*ec779b8eSAndroid Build Coastguard Worker 374*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase> createPlayer(player_type playerType); 375*ec779b8eSAndroid Build Coastguard Worker 376*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource( 377*ec779b8eSAndroid Build Coastguard Worker const sp<IMediaHTTPService> &httpService, 378*ec779b8eSAndroid Build Coastguard Worker const char *url, 379*ec779b8eSAndroid Build Coastguard Worker const KeyedVector<String8, String8> *headers); 380*ec779b8eSAndroid Build Coastguard Worker 381*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource(int fd, int64_t offset, int64_t length); 382*ec779b8eSAndroid Build Coastguard Worker 383*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource(const sp<IStreamSource> &source); 384*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource(const sp<IDataSource> &source); 385*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDataSource(const String8& rtpParams); 386*ec779b8eSAndroid Build Coastguard Worker 387*ec779b8eSAndroid Build Coastguard Worker 388*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase> setDataSource_pre(player_type playerType); 389*ec779b8eSAndroid Build Coastguard Worker status_t setDataSource_post(const sp<MediaPlayerBase>& p, 390*ec779b8eSAndroid Build Coastguard Worker status_t status); 391*ec779b8eSAndroid Build Coastguard Worker 392*ec779b8eSAndroid Build Coastguard Worker void notify(int msg, int ext1, int ext2, const Parcel *obj); 393*ec779b8eSAndroid Build Coastguard Worker pid()394*ec779b8eSAndroid Build Coastguard Worker pid_t pid() const { 395*ec779b8eSAndroid Build Coastguard Worker return VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mAttributionSource.pid)); 396*ec779b8eSAndroid Build Coastguard Worker } 397*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 398*ec779b8eSAndroid Build Coastguard Worker getAudioSessionId()399*ec779b8eSAndroid Build Coastguard Worker audio_session_t getAudioSessionId() { return mAudioSessionId; } 400*ec779b8eSAndroid Build Coastguard Worker // Modular DRM 401*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId); 402*ec779b8eSAndroid Build Coastguard Worker virtual status_t releaseDrm(); 403*ec779b8eSAndroid Build Coastguard Worker // AudioRouting 404*ec779b8eSAndroid Build Coastguard Worker virtual status_t setOutputDevice(audio_port_handle_t deviceId); 405*ec779b8eSAndroid Build Coastguard Worker virtual status_t getRoutedDeviceIds(DeviceIdVector& deviceIds); 406*ec779b8eSAndroid Build Coastguard Worker virtual status_t enableAudioDeviceCallback(bool enabled); 407*ec779b8eSAndroid Build Coastguard Worker 408*ec779b8eSAndroid Build Coastguard Worker private: 409*ec779b8eSAndroid Build Coastguard Worker class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback 410*ec779b8eSAndroid Build Coastguard Worker { 411*ec779b8eSAndroid Build Coastguard Worker public: AudioDeviceUpdatedNotifier(const sp<MediaPlayerBase> & listener)412*ec779b8eSAndroid Build Coastguard Worker AudioDeviceUpdatedNotifier(const sp<MediaPlayerBase>& listener) { 413*ec779b8eSAndroid Build Coastguard Worker mListener = listener; 414*ec779b8eSAndroid Build Coastguard Worker } ~AudioDeviceUpdatedNotifier()415*ec779b8eSAndroid Build Coastguard Worker ~AudioDeviceUpdatedNotifier() {} 416*ec779b8eSAndroid Build Coastguard Worker 417*ec779b8eSAndroid Build Coastguard Worker virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo, 418*ec779b8eSAndroid Build Coastguard Worker const DeviceIdVector& deviceIds); 419*ec779b8eSAndroid Build Coastguard Worker 420*ec779b8eSAndroid Build Coastguard Worker private: 421*ec779b8eSAndroid Build Coastguard Worker wp<MediaPlayerBase> mListener; 422*ec779b8eSAndroid Build Coastguard Worker }; 423*ec779b8eSAndroid Build Coastguard Worker 424*ec779b8eSAndroid Build Coastguard Worker friend class MediaPlayerService; 425*ec779b8eSAndroid Build Coastguard Worker Client( const sp<MediaPlayerService>& service, 426*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 427*ec779b8eSAndroid Build Coastguard Worker int32_t connId, 428*ec779b8eSAndroid Build Coastguard Worker const sp<IMediaPlayerClient>& client, 429*ec779b8eSAndroid Build Coastguard Worker audio_session_t audioSessionId); 430*ec779b8eSAndroid Build Coastguard Worker Client(); 431*ec779b8eSAndroid Build Coastguard Worker virtual ~Client(); 432*ec779b8eSAndroid Build Coastguard Worker 433*ec779b8eSAndroid Build Coastguard Worker void deletePlayer(); 434*ec779b8eSAndroid Build Coastguard Worker getPlayer()435*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase> getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; } 436*ec779b8eSAndroid Build Coastguard Worker 437*ec779b8eSAndroid Build Coastguard Worker 438*ec779b8eSAndroid Build Coastguard Worker 439*ec779b8eSAndroid Build Coastguard Worker // @param type Of the metadata to be tested. 440*ec779b8eSAndroid Build Coastguard Worker // @return true if the metadata should be dropped according to 441*ec779b8eSAndroid Build Coastguard Worker // the filters. 442*ec779b8eSAndroid Build Coastguard Worker bool shouldDropMetadata(media::Metadata::Type type) const; 443*ec779b8eSAndroid Build Coastguard Worker 444*ec779b8eSAndroid Build Coastguard Worker // Add a new element to the set of metadata updated. Noop if 445*ec779b8eSAndroid Build Coastguard Worker // the element exists already. 446*ec779b8eSAndroid Build Coastguard Worker // @param type Of the metadata to be recorded. 447*ec779b8eSAndroid Build Coastguard Worker void addNewMetadataUpdate(media::Metadata::Type type); 448*ec779b8eSAndroid Build Coastguard Worker 449*ec779b8eSAndroid Build Coastguard Worker // Disconnect from the currently connected ANativeWindow. 450*ec779b8eSAndroid Build Coastguard Worker void disconnectNativeWindow_l(); 451*ec779b8eSAndroid Build Coastguard Worker 452*ec779b8eSAndroid Build Coastguard Worker status_t setAudioAttributes_l(const Parcel &request); 453*ec779b8eSAndroid Build Coastguard Worker 454*ec779b8eSAndroid Build Coastguard Worker class Listener : public MediaPlayerBase::Listener { 455*ec779b8eSAndroid Build Coastguard Worker public: Listener(const wp<Client> & client)456*ec779b8eSAndroid Build Coastguard Worker Listener(const wp<Client> &client) : mClient(client) {} ~Listener()457*ec779b8eSAndroid Build Coastguard Worker virtual ~Listener() {} notify(int msg,int ext1,int ext2,const Parcel * obj)458*ec779b8eSAndroid Build Coastguard Worker virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) { 459*ec779b8eSAndroid Build Coastguard Worker sp<Client> client = mClient.promote(); 460*ec779b8eSAndroid Build Coastguard Worker if (client != NULL) { 461*ec779b8eSAndroid Build Coastguard Worker client->notify(msg, ext1, ext2, obj); 462*ec779b8eSAndroid Build Coastguard Worker } 463*ec779b8eSAndroid Build Coastguard Worker } 464*ec779b8eSAndroid Build Coastguard Worker private: 465*ec779b8eSAndroid Build Coastguard Worker wp<Client> mClient; 466*ec779b8eSAndroid Build Coastguard Worker }; 467*ec779b8eSAndroid Build Coastguard Worker 468*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock; 469*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase> mPlayer; 470*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerService> mService; 471*ec779b8eSAndroid Build Coastguard Worker sp<IMediaPlayerClient> mClient; 472*ec779b8eSAndroid Build Coastguard Worker sp<AudioOutput> mAudioOutput; 473*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState mAttributionSource; 474*ec779b8eSAndroid Build Coastguard Worker status_t mStatus; 475*ec779b8eSAndroid Build Coastguard Worker bool mLoop; 476*ec779b8eSAndroid Build Coastguard Worker int32_t mConnId; 477*ec779b8eSAndroid Build Coastguard Worker audio_session_t mAudioSessionId; 478*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t * mAudioAttributes; 479*ec779b8eSAndroid Build Coastguard Worker sp<ANativeWindow> mConnectedWindow; 480*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> mConnectedWindowBinder; 481*ec779b8eSAndroid Build Coastguard Worker struct sockaddr_in mRetransmitEndpoint; 482*ec779b8eSAndroid Build Coastguard Worker bool mRetransmitEndpointValid; 483*ec779b8eSAndroid Build Coastguard Worker sp<Client> mNextClient; 484*ec779b8eSAndroid Build Coastguard Worker sp<MediaPlayerBase::Listener> mListener; 485*ec779b8eSAndroid Build Coastguard Worker 486*ec779b8eSAndroid Build Coastguard Worker // Metadata filters. 487*ec779b8eSAndroid Build Coastguard Worker media::Metadata::Filter mMetadataAllow; // protected by mLock 488*ec779b8eSAndroid Build Coastguard Worker media::Metadata::Filter mMetadataDrop; // protected by mLock 489*ec779b8eSAndroid Build Coastguard Worker 490*ec779b8eSAndroid Build Coastguard Worker // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE 491*ec779b8eSAndroid Build Coastguard Worker // notification we try to update mMetadataUpdated which is a 492*ec779b8eSAndroid Build Coastguard Worker // set: no duplicate. 493*ec779b8eSAndroid Build Coastguard Worker // getMetadata clears this set. 494*ec779b8eSAndroid Build Coastguard Worker media::Metadata::Filter mMetadataUpdated; // protected by mLock 495*ec779b8eSAndroid Build Coastguard Worker 496*ec779b8eSAndroid Build Coastguard Worker std::vector<DeathNotifier> mDeathNotifiers; 497*ec779b8eSAndroid Build Coastguard Worker sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener; 498*ec779b8eSAndroid Build Coastguard Worker #if CALLBACK_ANTAGONIZER 499*ec779b8eSAndroid Build Coastguard Worker Antagonizer* mAntagonizer; 500*ec779b8eSAndroid Build Coastguard Worker #endif 501*ec779b8eSAndroid Build Coastguard Worker }; // Client 502*ec779b8eSAndroid Build Coastguard Worker 503*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 504*ec779b8eSAndroid Build Coastguard Worker 505*ec779b8eSAndroid Build Coastguard Worker MediaPlayerService(); 506*ec779b8eSAndroid Build Coastguard Worker virtual ~MediaPlayerService(); 507*ec779b8eSAndroid Build Coastguard Worker 508*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mLock; 509*ec779b8eSAndroid Build Coastguard Worker SortedVector< wp<Client> > mClients; 510*ec779b8eSAndroid Build Coastguard Worker SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients; 511*ec779b8eSAndroid Build Coastguard Worker int32_t mNextConnId; 512*ec779b8eSAndroid Build Coastguard Worker 513*ec779b8eSAndroid Build Coastguard Worker #ifdef FUZZ_MODE_MEDIA_PLAYER_SERVICE 514*ec779b8eSAndroid Build Coastguard Worker public: 515*ec779b8eSAndroid Build Coastguard Worker friend class sp<MediaPlayerService>; 516*ec779b8eSAndroid Build Coastguard Worker static sp<MediaPlayerService> createForFuzzTesting(); 517*ec779b8eSAndroid Build Coastguard Worker #endif // FUZZ_MODE_MEDIA_PLAYER_SERVICE 518*ec779b8eSAndroid Build Coastguard Worker }; 519*ec779b8eSAndroid Build Coastguard Worker 520*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 521*ec779b8eSAndroid Build Coastguard Worker 522*ec779b8eSAndroid Build Coastguard Worker }; // namespace android 523*ec779b8eSAndroid Build Coastguard Worker 524*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIAPLAYERSERVICE_H 525