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/String8.h> 2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/RefBase.h> 2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 27ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia#include <media/AVSyncSettings.h> 2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioResamplerPublic.h> 2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioSystem.h> 3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/AudioTimestamp.h> 3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/BufferingSettings.h> 3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/Metadata.h> 3312b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia#include <media/stagefright/foundation/AHandler.h> 34ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia#include <mediaplayer2/MediaPlayer2Types.h> 3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is 3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// global, and not in android:: 3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct sockaddr_in; 3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android { 4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 42c2636035f0a7990cf9da95d2531f9f1c03b8c172Wei Jiastruct DataSourceDesc; 4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass Parcel; 4428288fb0b1da843cdd37edab0cdecff32abacdceWei Jiastruct ANativeWindowWrapper; 4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4 4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200 4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define DEFAULT_AUDIOSINK_SAMPLERATE 44100 4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// when the channel mask isn't known, use the channel count to derive a mask in AudioSink::open() 5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define CHANNEL_MASK_USE_CHANNEL_ORDER 0 5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// duration below which we do not allow deep audio buffering 5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000 5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 56ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jiaclass MediaPlayer2InterfaceListener: public RefBase 5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia{ 5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiapublic: 59ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj) = 0; 60ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia}; 615096385d0e5c102a7297d53aeb693402f304f5afPawin Vongmasa 62ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jiaclass MediaPlayer2Interface : public AHandler { 63ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jiapublic: 6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // AudioSink: abstraction layer for audio output 6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia class AudioSink : public RefBase { 6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia public: 6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia enum cb_event_t { 6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_FILL_BUFFER, // Request to write more data to buffer. 6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_STREAM_END, // Sent after all the buffers queued in AF and HW are played 7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // back (after stop is called) 7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CB_EVENT_TEAR_DOWN // The AudioTrack was invalidated due to use case change: 7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Need to re-evaluate offloading options 7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia }; 7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Callback returns the number of bytes actually written to the buffer. 7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia typedef size_t (*AudioCallback)( 77ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia AudioSink *audioSink, void *buffer, size_t size, void *cookie, cb_event_t event); 78ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia 79ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ~AudioSink() {} 80ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual bool ready() const = 0; // audio output is open and ready 81ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ssize_t bufferSize() const = 0; 82ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ssize_t frameCount() const = 0; 83ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ssize_t channelCount() const = 0; 84ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ssize_t frameSize() const = 0; 85ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual uint32_t latency() const = 0; 86ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual float msecsPerFrame() const = 0; 87ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getPosition(uint32_t *position) const = 0; 88ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getTimestamp(AudioTimestamp &ts) const = 0; 89ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const = 0; 90ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getFramesWritten(uint32_t *frameswritten) const = 0; 9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual audio_session_t getSessionId() const = 0; 9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual audio_stream_type_t getAudioStreamType() const = 0; 93ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual uint32_t getSampleRate() const = 0; 94ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual int64_t getBufferDurationInUs() const = 0; 9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // If no callback is specified, use the "write" API below to submit 9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // audio data. 98ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t open( 9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia audio_format_t format=AUDIO_FORMAT_PCM_16_BIT, 10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT, 10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia AudioCallback cb = NULL, 10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia void *cookie = NULL, 10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, 10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const audio_offload_info_t *offloadInfo = NULL, 10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool doNotReconnect = false, 10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t suggestedFrameCount = 0) = 0; 10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 109ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t start() = 0; 11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia /* Input parameter |size| is in byte units stored in |buffer|. 11253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Data is copied over and actual number of bytes written (>= 0) 11353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * is returned, or no data is copied and a negative status code 11453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * is returned (even when |blocking| is true). 11553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * When |blocking| is false, AudioSink will immediately return after 11653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * part of or full |buffer| is copied over. 11753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * When |blocking| is true, AudioSink will wait to copy the entire 11853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * buffer, unless an error occurs or the copy operation is 11953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * prematurely stopped. 12053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */ 121ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ssize_t write(const void* buffer, size_t size, bool blocking = true) = 0; 12253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 123ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void stop() = 0; 124ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void flush() = 0; 125ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void pause() = 0; 126ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void close() = 0; 12753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 128ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setPlaybackRate(const AudioPlaybackRate& rate) = 0; 129ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */) = 0; 130ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual bool needsTrailingPadding() { 131ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia return true; 132ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia } 13353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 134ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setParameters(const String8& /* keyValuePairs */) { 135ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia return NO_ERROR; 136ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia } 137ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual String8 getParameters(const String8& /* keys */) { 138ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia return String8::empty(); 139ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia } 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 147ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia MediaPlayer2Interface() : mListener(NULL) { } 148ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual ~MediaPlayer2Interface() { } 149ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t initCheck() = 0; 15053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 151ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual void setAudioSink(const sp<AudioSink>& audioSink) { 152ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia mAudioSink = audioSink; 153ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia } 15433abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia 155ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setDataSource(const sp<DataSourceDesc> &dsd) = 0; 15657aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia 157ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t prepareNextDataSource(const sp<DataSourceDesc> &dsd) = 0; 15857aeffd55c2acff5a0f82771cea1f72639a110d7Wei Jia 159ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t playNextDataSource(int64_t srcId) = 0; 16053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 16128288fb0b1da843cdd37edab0cdecff32abacdceWei Jia // pass the buffered native window to the media player service 162ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setVideoSurfaceTexture(const sp<ANativeWindowWrapper>& nww) = 0; 16353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 164ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */) { 16553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *buffering = BufferingSettings(); 16653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 16753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 168ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setBufferingSettings(const BufferingSettings& /* buffering */) { 16953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 17053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 17153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 172ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t prepareAsync() = 0; 173ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t start() = 0; 174ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t stop() = 0; 175ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t pause() = 0; 176ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual bool isPlaying() = 0; 177ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate) { 17853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // by default, players only support setting rate to the default 17953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!isAudioPlaybackRateEqual(rate, AUDIO_PLAYBACK_RATE_DEFAULT)) { 18053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return BAD_VALUE; 18153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 18253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 18353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 184ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) { 18553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *rate = AUDIO_PLAYBACK_RATE_DEFAULT; 18653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 18753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 188ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setSyncSettings(const AVSyncSettings& sync, float /* videoFps */) { 18953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // By default, players only support setting sync source to default; all other sync 19053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // settings are ignored. There is no requirement for getters to return set values. 19153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (sync.mSource != AVSYNC_SOURCE_DEFAULT) { 19253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return BAD_VALUE; 19353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 19453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 19553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 196ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getSyncSettings( 197ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */) { 19853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *sync = AVSyncSettings(); 19953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *videoFps = -1.f; 20053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 20153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 202ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t seekTo( 203800fe37160c77c2da1dc78ed4e76047a42ea061aWei Jia int64_t msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) = 0; 204800fe37160c77c2da1dc78ed4e76047a42ea061aWei Jia virtual status_t getCurrentPosition(int64_t *msec) = 0; 205800fe37160c77c2da1dc78ed4e76047a42ea061aWei Jia virtual status_t getDuration(int64_t *msec) = 0; 206ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t reset() = 0; 207ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t notifyAt(int64_t /* mediaTimeUs */) { 20853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 20953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 210ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setLooping(int loop) = 0; 211ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t setParameter(int key, const Parcel &request) = 0; 212ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getParameter(int key, Parcel *reply) = 0; 21353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Invoke a generic method on the player by using opaque parcels 21553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // for the request and reply. 21653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // 21753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param request Parcel that is positioned at the start of the 21853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // data sent by the java layer. 21953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param[out] reply Parcel to hold the reply data. Cannot be null. 22053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @return OK if the call was successful. 221ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; 22253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 22353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // The Client in the MetadataPlayerService calls this method on 22453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the native player to retrieve all or a subset of metadata. 22553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // 22653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param ids SortedList of metadata ID to be fetch. If empty, all 22753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the known metadata should be returned. 22853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @param[inout] records Parcel where the player appends its metadata. 22953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // @return OK if the call was successful. 230ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t getMetadata(const media::Metadata::Filter& /* ids */, 231ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia Parcel* /* records */) { 23253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 23353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia }; 23453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 235ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia void setListener(const sp<MediaPlayer2InterfaceListener> &listener) { 236ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia Mutex::Autolock autoLock(mListenerLock); 237ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia mListener = listener; 23853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 23953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 240ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia void sendEvent(int64_t srcId, int msg, int ext1=0, int ext2=0, const Parcel *obj=NULL) { 241ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia sp<MediaPlayer2InterfaceListener> listener; 24253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 243ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia Mutex::Autolock autoLock(mListenerLock); 244ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia listener = mListener; 24553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 24653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 247ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia if (listener) { 248ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia listener->notify(srcId, msg, ext1, ext2, obj); 249ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia } 25053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 25153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 25253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const { 25353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 25453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 25553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 25612b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia virtual void onMessageReceived(const sp<AMessage> & /* msg */) override { } 25712b9f4a2f866c5917bcce1d510df0d5ffeb99d05Wei Jia 25853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Modular DRM 259ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia virtual status_t prepareDrm(const uint8_t /* uuid */[16], 260ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia const Vector<uint8_t>& /* drmSessionId */) { 26153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 26253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia virtual status_t releaseDrm() { 26453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 26553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 26733abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jiaprotected: 268ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia sp<AudioSink> mAudioSink; 26933abcc7f15ef40a7d57a2f49dd8cce231c405016Wei Jia 27053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprivate: 271ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia Mutex mListenerLock; 272ec044b069f6d1d8c274a182c9bc0d89fd7d6ff0dWei Jia sp<MediaPlayer2InterfaceListener> mListener; 27353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}; 27453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 27553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}; // namespace android 27653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 27753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#endif // __cplusplus 27853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 27953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#endif // ANDROID_MEDIAPLAYER2INTERFACE_H 281