MediaPlayerInterface.h revision e1c3962e268ffc12bfd1bd9ea84da1f135f36960
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 The Android Open Source Project 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * you may not use this file except in compliance with the License. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You may obtain a copy of the License at 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * See the License for the specific language governing permissions and 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * limitations under the License. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef ANDROID_MEDIAPLAYERINTERFACE_H 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define ANDROID_MEDIAPLAYERINTERFACE_H 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef __cplusplus 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <sys/types.h> 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <utils/Errors.h> 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <utils/KeyedVector.h> 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <utils/String8.h> 26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <utils/RefBase.h> 27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <media/mediaplayer.h> 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include <media/AudioSystem.h> 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <media/Metadata.h> 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochnamespace android { 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class Parcel; 351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class Surface; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ISurfaceTexture; 37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename T> class SortedVector; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum player_type { 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) PV_PLAYER = 1, 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) SONIVOX_PLAYER = 2, 43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch STAGEFRIGHT_PLAYER = 3, 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NU_PLAYER = 4, 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Test players are available only in the 'test' and 'eng' builds. 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The shared library with the test player is passed passed as an 47323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // argument to the 'test:' url in the setDataSource call. 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TEST_PLAYER = 5, 495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DEFAULT_AUDIOSINK_SAMPLERATE 44100 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)// callback mechanism for passing messages to MediaPlayer object 5843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)typedef void (*notify_callback_f)(void* cookie, 5943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) int msg, int ext1, int ext2, const Parcel *obj); 6043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 6143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)// abstract base class - use MediaPlayerInterface 6243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class MediaPlayerBase : public RefBase 6343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 6443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)public: 6543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) // AudioSink: abstraction layer for audio output 6643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) class AudioSink : public RefBase { 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch public: 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Callback returns the number of bytes actually written to the buffer. 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch typedef size_t (*AudioCallback)( 70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch AudioSink *audioSink, void *buffer, size_t size, void *cookie); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~AudioSink() {} 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual bool ready() const = 0; // audio output is open and ready 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual bool realtime() const = 0; // audio output is real-time output 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual ssize_t bufferSize() const = 0; 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual ssize_t frameCount() const = 0; 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual ssize_t channelCount() const = 0; 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual ssize_t frameSize() const = 0; 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual uint32_t latency() const = 0; 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual float msecsPerFrame() const = 0; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t getPosition(uint32_t *position) = 0; 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual int getSessionId() = 0; 83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If no callback is specified, use the "write" API below to submit 85e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // audio data. 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t open( 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) uint32_t sampleRate, int channelCount, 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) audio_format_t format=AUDIO_FORMAT_PCM_16_BIT, 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT, 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioCallback cb = NULL, 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void *cookie = NULL) = 0; 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void start() = 0; 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual ssize_t write(const void* buffer, size_t size) = 0; 95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void stop() = 0; 96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void flush() = 0; 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void pause() = 0; 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void close() = 0; 99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch }; 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MediaPlayerBase() : mCookie(0), mNotify(0) {} 1028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual ~MediaPlayerBase() {} 1038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual status_t initCheck() = 0; 1048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual bool hardwareOutput() = 0; 1058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual status_t setUID(uid_t uid) { 1078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return INVALID_OPERATION; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t setDataSource( 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *url, 112f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) const KeyedVector<String8, String8> *headers = NULL) = 0; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 114e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0; 115521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t setDataSource(const sp<IStreamSource> &source) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return INVALID_OPERATION; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // pass the buffered ISurfaceTexture to the media player service 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t setVideoSurfaceTexture( 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const sp<ISurfaceTexture>& surfaceTexture) = 0; 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t prepare() = 0; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t prepareAsync() = 0; 126e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch virtual status_t start() = 0; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t stop() = 0; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t pause() = 0; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isPlaying() = 0; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t seekTo(int msec) = 0; 131e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch virtual status_t getCurrentPosition(int *msec) = 0; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t getDuration(int *msec) = 0; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t reset() = 0; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t setLooping(int loop) = 0; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual player_type playerType() = 0; 1368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) virtual status_t setParameter(int key, const Parcel &request) = 0; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t getParameter(int key, Parcel *reply) = 0; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Invoke a generic method on the player by using opaque parcels 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for the request and reply. 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @param request Parcel that is positioned at the start of the 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // data sent by the java layer. 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @param[out] reply Parcel to hold the reply data. Cannot be null. 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @return OK if the call was successful. 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The Client in the MetadataPlayerService calls this method on 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the native player to retrieve all or a subset of metadata. 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @param ids SortedList of metadata ID to be fetch. If empty, all 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the known metadata should be returned. 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @param[inout] records Parcel where the player appends its metadata. 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @return OK if the call was successful. 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t getMetadata(const media::Metadata::Filter& ids, 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Parcel *records) { 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return INVALID_OPERATION; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setNotifyCallback( 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* cookie, notify_callback_f notifyFunc) { 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex::Autolock autoLock(mNotifyLock); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mCookie = cookie; mNotify = notifyFunc; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void sendEvent(int msg, int ext1=0, int ext2=0, 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Parcel *obj=NULL) { 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex::Autolock autoLock(mNotifyLock); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mNotify) mNotify(mCookie, msg, ext1, ext2, obj); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual status_t dump(int fd, const Vector<String16> &args) const { 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return INVALID_OPERATION; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class MediaPlayerService; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Mutex mNotifyLock; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* mCookie; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) notify_callback_f mNotify; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Implement this class for media players that use the AudioFlinger software mixer 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaPlayerInterface : public MediaPlayerBase 186e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 1871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)public: 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~MediaPlayerInterface() { } 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool hardwareOutput() { return false; } 190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void setAudioSink(const sp<AudioSink>& audioSink) { mAudioSink = audioSink; } 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 1925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) sp<AudioSink> mAudioSink; 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Implement this class for media players that output audio directly to hardware 196class MediaPlayerHWInterface : public MediaPlayerBase 197{ 198public: 199 virtual ~MediaPlayerHWInterface() {} 200 virtual bool hardwareOutput() { return true; } 201 virtual status_t setVolume(float leftVolume, float rightVolume) = 0; 202 virtual status_t setAudioStreamType(int streamType) = 0; 203}; 204 205}; // namespace android 206 207#endif // __cplusplus 208 209 210#endif // ANDROID_MEDIAPLAYERINTERFACE_H 211