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