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