MediaPlayer2Interface.h revision 57aeffd55c2acff5a0f82771cea1f72639a110d7
153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia/* 253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Copyright 2017 The Android Open Source Project 353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * you may not use this file except in compliance with the License. 653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * You may obtain a copy of the License at 753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * http://www.apache.org/licenses/LICENSE-2.0 953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Unless required by applicable law or agreed to in writing, software 1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * distributed under the License is distributed on an "AS IS" BASIS, 1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * See the License for the specific language governing permissions and 1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * limitations under the License. 1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */ 1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#ifndef ANDROID_MEDIAPLAYER2INTERFACE_H 1853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define ANDROID_MEDIAPLAYER2INTERFACE_H 1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#ifdef __cplusplus 2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <sys/types.h> 2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/Errors.h> 2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/KeyedVector.h> 2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/String8.h> 2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/RefBase.h> 2753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioResamplerPublic.h> 2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioSystem.h> 3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioTimestamp.h> 3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AVSyncSettings.h> 3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/BufferingSettings.h> 3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/Metadata.h> 3412b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia#include <media/stagefright/foundation/AHandler.h> 3551b6956bc8e09eb2237a10a401baebb35096e6abWei Jia#include <mediaplayer2/mediaplayer2.h> 3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is 3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// global, and not in android:: 3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct sockaddr_in; 4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android { 4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass DataSource; 44c2636035f0a7990cf9da95d2531f9f1c03b8c172Wei Jiastruct DataSourceDesc; 4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct MediaHTTPService; 4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass Parcel; 4728288fb0b1da843cdd37edab0cdecff32abacdceWei Jiastruct ANativeWindowWrapper; 4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiatemplate<typename T> class SortedVector; 5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4 5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200 5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_SAMPLERATE 44100 5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// when the channel mask isn't known, use the channel count to derive a mask in AudioSink::open() 5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define CHANNEL_MASK_USE_CHANNEL_ORDER 0 5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// duration below which we do not allow deep audio buffering 5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000 6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// abstract base class - use MediaPlayer2Interface 6233abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jiaclass MediaPlayer2Interface : public AHandler 6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia{ 6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiapublic: 655096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa // callback mechanism for passing messages to MediaPlayer2 object 665096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa typedef void (*NotifyCallback)(const wp<MediaPlayer2Engine> &listener, 67d2bb1bd1fb916dc487ff930cd8c1ec618b49573eWei Jia int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj); 685096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa 6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // AudioSink: abstraction layer for audio output 7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia class AudioSink : public RefBase { 7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia public: 7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia enum cb_event_t { 7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_FILL_BUFFER, // Request to write more data to buffer. 7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_STREAM_END, // Sent after all the buffers queued in AF and HW are played 7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // back (after stop is called) 7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_TEAR_DOWN // The AudioTrack was invalidated due to use case change: 7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Need to re-evaluate offloading options 7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia }; 7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Callback returns the number of bytes actually written to the buffer. 8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia typedef size_t (*AudioCallback)( 8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia AudioSink *audioSink, void *buffer, size_t size, void *cookie, 8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia cb_event_t event); 8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ~AudioSink() {} 8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual bool ready() const = 0; // audio output is open and ready 8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ssize_t bufferSize() const = 0; 8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ssize_t frameCount() const = 0; 8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ssize_t channelCount() const = 0; 9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ssize_t frameSize() const = 0; 9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual uint32_t latency() const = 0; 9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual float msecsPerFrame() const = 0; 9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getPosition(uint32_t *position) const = 0; 9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getTimestamp(AudioTimestamp &ts) const = 0; 9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const = 0; 9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getFramesWritten(uint32_t *frameswritten) const = 0; 9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual audio_session_t getSessionId() const = 0; 9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual audio_stream_type_t getAudioStreamType() const = 0; 9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual uint32_t getSampleRate() const = 0; 10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual int64_t getBufferDurationInUs() const = 0; 10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // If no callback is specified, use the "write" API below to submit 10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // audio data. 10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t open( 10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia audio_format_t format=AUDIO_FORMAT_PCM_16_BIT, 10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT, 10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia AudioCallback cb = NULL, 10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia void *cookie = NULL, 11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, 11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const audio_offload_info_t *offloadInfo = NULL, 11253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool doNotReconnect = false, 11353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t suggestedFrameCount = 0) = 0; 11453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t start() = 0; 11653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia /* Input parameter |size| is in byte units stored in |buffer|. 11853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Data is copied over and actual number of bytes written (>= 0) 11953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * is returned, or no data is copied and a negative status code 12053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * is returned (even when |blocking| is true). 12153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * When |blocking| is false, AudioSink will immediately return after 12253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * part of or full |buffer| is copied over. 12353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * When |blocking| is true, AudioSink will wait to copy the entire 12453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * buffer, unless an error occurs or the copy operation is 12553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * prematurely stopped. 12653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */ 12753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual ssize_t write(const void* buffer, size_t size, bool blocking = true) = 0; 12853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual void stop() = 0; 13053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual void flush() = 0; 13153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual void pause() = 0; 13253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual void close() = 0; 13353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setPlaybackRate(const AudioPlaybackRate& rate) = 0; 13553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */) = 0; 13653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual bool needsTrailingPadding() { return true; } 13753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setParameters(const String8& /* keyValuePairs */) { return NO_ERROR; } 13953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual String8 getParameters(const String8& /* keys */) { return String8::empty(); } 14053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // AudioRouting 14253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setOutputDevice(audio_port_handle_t deviceId); 14353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId); 14453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t enableAudioDeviceCallback(bool enabled); 14553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia }; 14653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14733abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia MediaPlayer2Interface() : mClient(0), mNotify(0) { } 14833abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia virtual ~MediaPlayer2Interface() { } 14953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t initCheck() = 0; 15053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15133abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia virtual void setAudioSink(const sp<AudioSink>& audioSink) { mAudioSink = audioSink; } 15233abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia 15357aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia virtual status_t setDataSource(const sp<DataSourceDesc> &dsd) = 0; 15457aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia 15557aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia virtual status_t prepareNextDataSource(const sp<DataSourceDesc> &dsd) = 0; 15657aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia 15757aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia virtual status_t playNextDataSource(int64_t srcId) = 0; 15853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15928288fb0b1da843cdd37edab0cdecff32abacdceWei Jia // pass the buffered native window to the media player service 16028288fb0b1da843cdd37edab0cdecff32abacdceWei Jia virtual status_t setVideoSurfaceTexture(const sp<ANativeWindowWrapper>& nww) = 0; 16153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 16253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getBufferingSettings( 16353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia BufferingSettings* buffering /* nonnull */) { 16453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *buffering = BufferingSettings(); 16553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 16653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 16753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setBufferingSettings(const BufferingSettings& /* buffering */) { 16853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 16953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 17053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 17153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t prepareAsync() = 0; 17253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t start() = 0; 17353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t stop() = 0; 17453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t pause() = 0; 17553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual bool isPlaying() = 0; 17653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate) { 17753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // by default, players only support setting rate to the default 17853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!isAudioPlaybackRateEqual(rate, AUDIO_PLAYBACK_RATE_DEFAULT)) { 17953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return BAD_VALUE; 18053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 18153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 18253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 18353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) { 18453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *rate = AUDIO_PLAYBACK_RATE_DEFAULT; 18553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 18653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 18753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setSyncSettings(const AVSyncSettings& sync, float /* videoFps */) { 18853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // By default, players only support setting sync source to default; all other sync 18953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // settings are ignored. There is no requirement for getters to return set values. 19053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (sync.mSource != AVSYNC_SOURCE_DEFAULT) { 19153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return BAD_VALUE; 19253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 19353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 19453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 19553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getSyncSettings( 19653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */) { 19753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *sync = AVSyncSettings(); 19853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *videoFps = -1.f; 19953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 20053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 20153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t seekTo( 20253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) = 0; 20353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getCurrentPosition(int *msec) = 0; 20453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getDuration(int *msec) = 0; 20553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t reset() = 0; 20653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t notifyAt(int64_t /* mediaTimeUs */) { 20753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 20853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 20953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setLooping(int loop) = 0; 21053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t setParameter(int key, const Parcel &request) = 0; 21153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getParameter(int key, Parcel *reply) = 0; 21253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21333abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia virtual status_t setNextPlayer(const sp<MediaPlayer2Interface>& /* next */) { 21453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 21553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 21653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Invoke a generic method on the player by using opaque parcels 21853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // for the request and reply. 21953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // 22053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param request Parcel that is positioned at the start of the 22153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // data sent by the java layer. 22253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param[out] reply Parcel to hold the reply data. Cannot be null. 22353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @return OK if the call was successful. 22453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; 22553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 22653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // The Client in the MetadataPlayerService calls this method on 22753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the native player to retrieve all or a subset of metadata. 22853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // 22953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param ids SortedList of metadata ID to be fetch. If empty, all 23053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the known metadata should be returned. 23153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param[inout] records Parcel where the player appends its metadata. 23253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @return OK if the call was successful. 23353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t getMetadata(const media::Metadata::Filter& /* ids */, 23453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Parcel* /* records */) { 23553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 23653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia }; 23753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 23853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia void setNotifyCallback( 2395096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa const wp<MediaPlayer2Engine> &client, NotifyCallback notifyFunc) { 24053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock autoLock(mNotifyLock); 2415096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa mClient = client; mNotify = notifyFunc; 24253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 24353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 244d2bb1bd1fb916dc487ff930cd8c1ec618b49573eWei Jia void sendEvent(int64_t srcId, int msg, int ext1=0, int ext2=0, 24553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const Parcel *obj=NULL) { 2465096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa NotifyCallback notifyCB; 2475096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa wp<MediaPlayer2Engine> client; 24853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 24953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock autoLock(mNotifyLock); 25053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyCB = mNotify; 2515096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa client = mClient; 25253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 25353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 254d2bb1bd1fb916dc487ff930cd8c1ec618b49573eWei Jia if (notifyCB) notifyCB(client, srcId, msg, ext1, ext2, obj); 25553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 25653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 25753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const { 25853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 25953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 26112b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia virtual void onMessageReceived(const sp<AMessage> & /* msg */) override { } 26212b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia 26353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Modular DRM 26453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t prepareDrm(const uint8_t /* uuid */[16], const Vector<uint8_t>& /* drmSessionId */) { 26553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 26653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t releaseDrm() { 26853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 26953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 27053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 27133abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jiaprotected: 27233abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia sp<AudioSink> mAudioSink; 27333abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia 27453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprivate: 27553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia friend class MediaPlayer2Manager; 27653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2775096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa Mutex mNotifyLock; 2785096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa wp<MediaPlayer2Engine> mClient; 2795096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa NotifyCallback mNotify; 28053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}; 28153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}; // namespace android 28353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#endif // __cplusplus 28553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#endif // ANDROID_MEDIAPLAYER2INTERFACE_H 288