1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2007 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef ANDROID_MEDIAPLAYERINTERFACE_H 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define ANDROID_MEDIAPLAYERINTERFACE_H 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifdef __cplusplus 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <sys/types.h> 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/Errors.h> 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/KeyedVector.h> 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/String8.h> 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/RefBase.h> 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/mediaplayer.h> 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioResamplerPublic.h> 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioSystem.h> 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AudioTimestamp.h> 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/AVSyncSettings.h> 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/BufferingSettings.h> 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/Metadata.h> 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// global, and not in android:: 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct sockaddr_in; 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android { 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DataSource; 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Parcel; 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Surface; 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass IGraphicBufferProducer; 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate<typename T> class SortedVector; 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanenum player_type { 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman STAGEFRIGHT_PLAYER = 3, 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman NU_PLAYER = 4, 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Test players are available only in the 'test' and 'eng' builds. 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // The shared library with the test player is passed passed as an 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // argument to the 'test:' url in the setDataSource call. 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman TEST_PLAYER = 5, 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DEFAULT_AUDIOSINK_SAMPLERATE 44100 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// when the channel mask isn't known, use the channel count to derive a mask in AudioSink::open() 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define CHANNEL_MASK_USE_CHANNEL_ORDER 0 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// duration below which we do not allow deep audio buffering 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// callback mechanism for passing messages to MediaPlayer object 705ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasatypedef void (*notify_callback_f)(const wp<IMediaPlayer> &listener, 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int msg, int ext1, int ext2, const Parcel *obj); 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// abstract base class - use MediaPlayerInterface 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass MediaPlayerBase : public RefBase 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // AudioSink: abstraction layer for audio output 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman class AudioSink : public RefBase { 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman public: 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman enum cb_event_t { 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman CB_EVENT_FILL_BUFFER, // Request to write more data to buffer. 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman CB_EVENT_STREAM_END, // Sent after all the buffers queued in AF and HW are played 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // back (after stop is called) 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman CB_EVENT_TEAR_DOWN // The AudioTrack was invalidated due to use case change: 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Need to re-evaluate offloading options 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman }; 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Callback returns the number of bytes actually written to the buffer. 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman typedef size_t (*AudioCallback)( 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman AudioSink *audioSink, void *buffer, size_t size, void *cookie, 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman cb_event_t event); 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~AudioSink() {} 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool ready() const = 0; // audio output is open and ready 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ssize_t bufferSize() const = 0; 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ssize_t frameCount() const = 0; 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ssize_t channelCount() const = 0; 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ssize_t frameSize() const = 0; 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual uint32_t latency() const = 0; 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual float msecsPerFrame() const = 0; 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getPosition(uint32_t *position) const = 0; 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getTimestamp(AudioTimestamp &ts) const = 0; 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const = 0; 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getFramesWritten(uint32_t *frameswritten) const = 0; 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual audio_session_t getSessionId() const = 0; 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual audio_stream_type_t getAudioStreamType() const = 0; 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual uint32_t getSampleRate() const = 0; 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual int64_t getBufferDurationInUs() const = 0; 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // If no callback is specified, use the "write" API below to submit 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // audio data. 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t open( 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_format_t format=AUDIO_FORMAT_PCM_16_BIT, 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT, 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman AudioCallback cb = NULL, 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void *cookie = NULL, 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const audio_offload_info_t *offloadInfo = NULL, 120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool doNotReconnect = false, 121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t suggestedFrameCount = 0) = 0; 122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t start() = 0; 124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Input parameter |size| is in byte units stored in |buffer|. 126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Data is copied over and actual number of bytes written (>= 0) 127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * is returned, or no data is copied and a negative status code 128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * is returned (even when |blocking| is true). 129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * When |blocking| is false, AudioSink will immediately return after 130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * part of or full |buffer| is copied over. 131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * When |blocking| is true, AudioSink will wait to copy the entire 132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * buffer, unless an error occurs or the copy operation is 133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * prematurely stopped. 134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ssize_t write(const void* buffer, size_t size, bool blocking = true) = 0; 136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void stop() = 0; 138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void flush() = 0; 139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void pause() = 0; 140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void close() = 0; 141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setPlaybackRate(const AudioPlaybackRate& rate) = 0; 143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getPlaybackRate(AudioPlaybackRate* rate /* nonnull */) = 0; 144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool needsTrailingPadding() { return true; } 145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setParameters(const String8& /* keyValuePairs */) { return NO_ERROR; } 147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual String8 getParameters(const String8& /* keys */) { return String8::empty(); } 148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual VolumeShaper::Status applyVolumeShaper( 150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const sp<VolumeShaper::Configuration>& configuration, 151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const sp<VolumeShaper::Operation>& operation); 152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual sp<VolumeShaper::State> getVolumeShaperState(int id); 153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman }; 154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 1555ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa MediaPlayerBase() : mClient(0), mNotify(0) {} 156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~MediaPlayerBase() {} 157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t initCheck() = 0; 158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool hardwareOutput() = 0; 159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setUID(uid_t /* uid */) { 161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setDataSource( 165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const sp<IMediaHTTPService> &httpService, 166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const char *url, 167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const KeyedVector<String8, String8> *headers = NULL) = 0; 168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0; 170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setDataSource(const sp<IStreamSource>& /* source */) { 172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 173e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 174e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 175e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setDataSource(const sp<DataSource>& /* source */) { 176e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 177e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 178e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 179e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // pass the buffered IGraphicBufferProducer to the media player service 180e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setVideoSurfaceTexture( 181e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const sp<IGraphicBufferProducer>& bufferProducer) = 0; 182e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 183e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getDefaultBufferingSettings( 184e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman BufferingSettings* buffering /* nonnull */) { 185e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *buffering = BufferingSettings(); 186e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 187e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 188e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setBufferingSettings(const BufferingSettings& /* buffering */) { 189e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 190e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 191e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 192e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t prepare() = 0; 193e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t prepareAsync() = 0; 194e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t start() = 0; 195e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t stop() = 0; 196e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t pause() = 0; 197e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool isPlaying() = 0; 198e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setPlaybackSettings(const AudioPlaybackRate& rate) { 199e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // by default, players only support setting rate to the default 200e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (!isAudioPlaybackRateEqual(rate, AUDIO_PLAYBACK_RATE_DEFAULT)) { 201e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return BAD_VALUE; 202e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 203e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 204e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 205e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) { 206e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *rate = AUDIO_PLAYBACK_RATE_DEFAULT; 207e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 208e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 209e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setSyncSettings(const AVSyncSettings& sync, float /* videoFps */) { 210e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // By default, players only support setting sync source to default; all other sync 211e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // settings are ignored. There is no requirement for getters to return set values. 212e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (sync.mSource != AVSYNC_SOURCE_DEFAULT) { 213e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return BAD_VALUE; 214e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 215e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 216e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 217e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getSyncSettings( 218e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */) { 219e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *sync = AVSyncSettings(); 220e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *videoFps = -1.f; 221e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 222e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 223e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t seekTo( 224e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int msec, MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) = 0; 225e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getCurrentPosition(int *msec) = 0; 226e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getDuration(int *msec) = 0; 227e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t reset() = 0; 228e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setLooping(int loop) = 0; 229e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual player_type playerType() = 0; 230e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setParameter(int key, const Parcel &request) = 0; 231e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getParameter(int key, Parcel *reply) = 0; 232e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 233e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // default no-op implementation of optional extensions 234e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setRetransmitEndpoint(const struct sockaddr_in* /* endpoint */) { 235e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 236e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 237e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getRetransmitEndpoint(struct sockaddr_in* /* endpoint */) { 238e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 239e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 240e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setNextPlayer(const sp<MediaPlayerBase>& /* next */) { 241e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return OK; 242e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 243e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 244e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Invoke a generic method on the player by using opaque parcels 245e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // for the request and reply. 246e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // 247e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @param request Parcel that is positioned at the start of the 248e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // data sent by the java layer. 249e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @param[out] reply Parcel to hold the reply data. Cannot be null. 250e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @return OK if the call was successful. 251e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; 252e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 253e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // The Client in the MetadataPlayerService calls this method on 254e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // the native player to retrieve all or a subset of metadata. 255e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // 256e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @param ids SortedList of metadata ID to be fetch. If empty, all 257e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // the known metadata should be returned. 258e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @param[inout] records Parcel where the player appends its metadata. 259e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // @return OK if the call was successful. 260e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getMetadata(const media::Metadata::Filter& /* ids */, 261e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Parcel* /* records */) { 262e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 263e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman }; 264e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 265e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void setNotifyCallback( 2665ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa const wp<IMediaPlayer> &client, notify_callback_f notifyFunc) { 267e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Mutex::Autolock autoLock(mNotifyLock); 2685ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa mClient = client; mNotify = notifyFunc; 269e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 270e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 271e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void sendEvent(int msg, int ext1=0, int ext2=0, 272e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const Parcel *obj=NULL) { 273e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman notify_callback_f notifyCB; 2745ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa wp<IMediaPlayer> client; 275e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman { 276e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Mutex::Autolock autoLock(mNotifyLock); 277e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman notifyCB = mNotify; 2785ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa client = mClient; 279e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 280e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 2815ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa if (notifyCB) notifyCB(client, msg, ext1, ext2, obj); 282e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 283e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 284e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const { 285e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 286e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 287e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 288e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Modular DRM 289b8c35f94470d1518e2def0582aaec4e038c92af0Colin Cross virtual status_t prepareDrm(const uint8_t /* uuid */[16], const Vector<uint8_t>& /* drmSessionId */) { 290e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 291e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 292e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t releaseDrm() { 293e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return INVALID_OPERATION; 294e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 295e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 296e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 297e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman friend class MediaPlayerService; 298e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 299e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Mutex mNotifyLock; 3005ffa7ea0dfa9ba3eba8ded0878c5293dc35e74a9Pawin Vongmasa wp<IMediaPlayer> mClient; 301e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman notify_callback_f mNotify; 302e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 303e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 304e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// Implement this class for media players that use the AudioFlinger software mixer 305e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass MediaPlayerInterface : public MediaPlayerBase 306e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 307e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 308e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~MediaPlayerInterface() { } 309e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool hardwareOutput() { return false; } 310e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void setAudioSink(const sp<AudioSink>& audioSink) { mAudioSink = audioSink; } 311e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprotected: 312e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<AudioSink> mAudioSink; 313e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 314e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 315e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// Implement this class for media players that output audio directly to hardware 316e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass MediaPlayerHWInterface : public MediaPlayerBase 317e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 318e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 319e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~MediaPlayerHWInterface() {} 320e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool hardwareOutput() { return true; } 321e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setVolume(float leftVolume, float rightVolume) = 0; 322e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setAudioStreamType(audio_stream_type_t streamType) = 0; 323e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 324e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 325e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; // namespace android 326e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 327e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // __cplusplus 328e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 329e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 330e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // ANDROID_MEDIAPLAYERINTERFACE_H 331