df9b81ced4
The visualizer enables application to retrieve part of the currently playing audio for visualization purpose. It is not an audio recording interface and only returns partial and low quality audio content as a waveform or a frequency representation (FFT). Removed temporary hack made in MediaPlayer for animated wall papers based on audio visualization (snoop() method. This commit also includes a change in AudioEffect class: - the enable()/disable() methods have been replaced bya more standard setEnabled() method. - some fixes in javadoc Change-Id: Id092a1340e9e38dae68646ade7be054e3a36980e
208 lines
7.8 KiB
C++
208 lines
7.8 KiB
C++
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_MEDIAPLAYER_H
|
|
#define ANDROID_MEDIAPLAYER_H
|
|
|
|
#include <binder/IMemory.h>
|
|
#include <media/IMediaPlayerClient.h>
|
|
#include <media/IMediaPlayer.h>
|
|
#include <media/IMediaDeathNotifier.h>
|
|
|
|
#include <utils/KeyedVector.h>
|
|
#include <utils/String8.h>
|
|
|
|
namespace android {
|
|
|
|
class Surface;
|
|
|
|
enum media_event_type {
|
|
MEDIA_NOP = 0, // interface test message
|
|
MEDIA_PREPARED = 1,
|
|
MEDIA_PLAYBACK_COMPLETE = 2,
|
|
MEDIA_BUFFERING_UPDATE = 3,
|
|
MEDIA_SEEK_COMPLETE = 4,
|
|
MEDIA_SET_VIDEO_SIZE = 5,
|
|
MEDIA_ERROR = 100,
|
|
MEDIA_INFO = 200,
|
|
};
|
|
|
|
// Generic error codes for the media player framework. Errors are fatal, the
|
|
// playback must abort.
|
|
//
|
|
// Errors are communicated back to the client using the
|
|
// MediaPlayerListener::notify method defined below.
|
|
// In this situation, 'notify' is invoked with the following:
|
|
// 'msg' is set to MEDIA_ERROR.
|
|
// 'ext1' should be a value from the enum media_error_type.
|
|
// 'ext2' contains an implementation dependant error code to provide
|
|
// more details. Should default to 0 when not used.
|
|
//
|
|
// The codes are distributed as follow:
|
|
// 0xx: Reserved
|
|
// 1xx: Android Player errors. Something went wrong inside the MediaPlayer.
|
|
// 2xx: Media errors (e.g Codec not supported). There is a problem with the
|
|
// media itself.
|
|
// 3xx: Runtime errors. Some extraordinary condition arose making the playback
|
|
// impossible.
|
|
//
|
|
enum media_error_type {
|
|
// 0xx
|
|
MEDIA_ERROR_UNKNOWN = 1,
|
|
// 1xx
|
|
MEDIA_ERROR_SERVER_DIED = 100,
|
|
// 2xx
|
|
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200,
|
|
// 3xx
|
|
};
|
|
|
|
|
|
// Info and warning codes for the media player framework. These are non fatal,
|
|
// the playback is going on but there might be some user visible issues.
|
|
//
|
|
// Info and warning messages are communicated back to the client using the
|
|
// MediaPlayerListener::notify method defined below. In this situation,
|
|
// 'notify' is invoked with the following:
|
|
// 'msg' is set to MEDIA_INFO.
|
|
// 'ext1' should be a value from the enum media_info_type.
|
|
// 'ext2' contains an implementation dependant info code to provide
|
|
// more details. Should default to 0 when not used.
|
|
//
|
|
// The codes are distributed as follow:
|
|
// 0xx: Reserved
|
|
// 7xx: Android Player info/warning (e.g player lagging behind.)
|
|
// 8xx: Media info/warning (e.g media badly interleaved.)
|
|
//
|
|
enum media_info_type {
|
|
// 0xx
|
|
MEDIA_INFO_UNKNOWN = 1,
|
|
// 7xx
|
|
// The video is too complex for the decoder: it can't decode frames fast
|
|
// enough. Possibly only the audio plays fine at this stage.
|
|
MEDIA_INFO_VIDEO_TRACK_LAGGING = 700,
|
|
// MediaPlayer is temporarily pausing playback internally in order to
|
|
// buffer more data.
|
|
MEDIA_INFO_BUFFERING_START = 701,
|
|
// MediaPlayer is resuming playback after filling buffers.
|
|
MEDIA_INFO_BUFFERING_END = 702,
|
|
// 8xx
|
|
// Bad interleaving means that a media has been improperly interleaved or not
|
|
// interleaved at all, e.g has all the video samples first then all the audio
|
|
// ones. Video is playing but a lot of disk seek may be happening.
|
|
MEDIA_INFO_BAD_INTERLEAVING = 800,
|
|
// The media is not seekable (e.g live stream).
|
|
MEDIA_INFO_NOT_SEEKABLE = 801,
|
|
// New media metadata is available.
|
|
MEDIA_INFO_METADATA_UPDATE = 802,
|
|
};
|
|
|
|
|
|
|
|
enum media_player_states {
|
|
MEDIA_PLAYER_STATE_ERROR = 0,
|
|
MEDIA_PLAYER_IDLE = 1 << 0,
|
|
MEDIA_PLAYER_INITIALIZED = 1 << 1,
|
|
MEDIA_PLAYER_PREPARING = 1 << 2,
|
|
MEDIA_PLAYER_PREPARED = 1 << 3,
|
|
MEDIA_PLAYER_STARTED = 1 << 4,
|
|
MEDIA_PLAYER_PAUSED = 1 << 5,
|
|
MEDIA_PLAYER_STOPPED = 1 << 6,
|
|
MEDIA_PLAYER_PLAYBACK_COMPLETE = 1 << 7
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// ref-counted object for callbacks
|
|
class MediaPlayerListener: virtual public RefBase
|
|
{
|
|
public:
|
|
virtual void notify(int msg, int ext1, int ext2) = 0;
|
|
};
|
|
|
|
class MediaPlayer : public BnMediaPlayerClient,
|
|
public virtual IMediaDeathNotifier
|
|
{
|
|
public:
|
|
MediaPlayer();
|
|
~MediaPlayer();
|
|
void died();
|
|
void disconnect();
|
|
|
|
status_t setDataSource(
|
|
const char *url,
|
|
const KeyedVector<String8, String8> *headers);
|
|
|
|
status_t setDataSource(int fd, int64_t offset, int64_t length);
|
|
status_t setVideoSurface(const sp<Surface>& surface);
|
|
status_t setListener(const sp<MediaPlayerListener>& listener);
|
|
status_t prepare();
|
|
status_t prepareAsync();
|
|
status_t start();
|
|
status_t stop();
|
|
status_t pause();
|
|
bool isPlaying();
|
|
status_t getVideoWidth(int *w);
|
|
status_t getVideoHeight(int *h);
|
|
status_t seekTo(int msec);
|
|
status_t getCurrentPosition(int *msec);
|
|
status_t getDuration(int *msec);
|
|
status_t reset();
|
|
status_t setAudioStreamType(int type);
|
|
status_t setLooping(int loop);
|
|
bool isLooping();
|
|
status_t setVolume(float leftVolume, float rightVolume);
|
|
void notify(int msg, int ext1, int ext2);
|
|
static sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
|
|
static sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
|
|
status_t invoke(const Parcel& request, Parcel *reply);
|
|
status_t setMetadataFilter(const Parcel& filter);
|
|
status_t getMetadata(bool update_only, bool apply_filter, Parcel *metadata);
|
|
status_t suspend();
|
|
status_t resume();
|
|
status_t setAudioSessionId(int sessionId);
|
|
int getAudioSessionId();
|
|
private:
|
|
void clear_l();
|
|
status_t seekTo_l(int msec);
|
|
status_t prepareAsync_l();
|
|
status_t getDuration_l(int *msec);
|
|
status_t setDataSource(const sp<IMediaPlayer>& player);
|
|
|
|
sp<IMediaPlayer> mPlayer;
|
|
thread_id_t mLockThreadId;
|
|
Mutex mLock;
|
|
Mutex mNotifyLock;
|
|
Condition mSignal;
|
|
sp<MediaPlayerListener> mListener;
|
|
void* mCookie;
|
|
media_player_states mCurrentState;
|
|
int mDuration;
|
|
int mCurrentPosition;
|
|
int mSeekPosition;
|
|
bool mPrepareSync;
|
|
status_t mPrepareStatus;
|
|
int mStreamType;
|
|
bool mLoop;
|
|
float mLeftVolume;
|
|
float mRightVolume;
|
|
int mVideoWidth;
|
|
int mVideoHeight;
|
|
int mAudioSessionId;
|
|
};
|
|
|
|
}; // namespace android
|
|
|
|
#endif // ANDROID_MEDIAPLAYER_H
|