94 lines
4.2 KiB
C
94 lines
4.2 KiB
C
|
#pragma once
|
||
|
#include "foundation/dispatch.h"
|
||
|
#include "foundation/error.h"
|
||
|
#include "foundation/types.h"
|
||
|
#include "metadata/ifc_metadata.h"
|
||
|
#include "audio/ifc_equalizer.h"
|
||
|
#include "nx/nxuri.h"
|
||
|
|
||
|
/* implemented by Winamp (or whatever application)
|
||
|
your ifc_playback implementation should call this with events
|
||
|
|
||
|
TODO: benski> should we require the ifc_playback object to get passed in to each function?
|
||
|
*/
|
||
|
|
||
|
class NOVTABLE ifc_player : public Wasabi2::Dispatchable
|
||
|
{
|
||
|
protected:
|
||
|
ifc_player() : Dispatchable(DISPATCHABLE_VERSION) {}
|
||
|
~ifc_player() {}
|
||
|
public:
|
||
|
|
||
|
/* When your playback object has read enough of the file to provide metadata
|
||
|
it should call this method.
|
||
|
It will be called for both song metadata (artist, album, etc) and codec metadata (bitrate, samplerate, etc).
|
||
|
so make sure you can provide both - this might mean you have to wait until the first frame is decoded.
|
||
|
The player object will add a reference in the function, and release whenever it is no longer needed (usually on start of next track)
|
||
|
*/
|
||
|
void SetMetadata(ifc_metadata *metadata) { Player_SetMetadata(metadata); }
|
||
|
|
||
|
/* Call this just once (with timestamp=0) for CBR files or update continuously for VBR
|
||
|
bitrate should be in bits per second, e.g. 128000 (not 128!)
|
||
|
*/
|
||
|
void SetBitrate(uint64_t bitrate, double timestamp) { Player_SetBitrate(bitrate, timestamp); }
|
||
|
|
||
|
/* Playback plugin should call this when it knows the length
|
||
|
can be updated if necessary (e.g. for VBR files w/o header)
|
||
|
If this is not called, it assumed to be a stream (radio)
|
||
|
*/
|
||
|
void SetLength(double length) { Player_SetLength(length); }
|
||
|
|
||
|
/* Output plugin should call this every once in a while,
|
||
|
if your input plugin does its own audio output (e.g. analog CD) you should call this yourself
|
||
|
*/
|
||
|
void SetPosition(double timestamp) { Player_SetPosition(timestamp); }
|
||
|
|
||
|
void OnLoaded(nx_uri_t filename) { Player_OnLoaded(filename); }
|
||
|
/* Input plugin should call this when playback ends at the end of the file
|
||
|
Do not call if playback stopped because of an error */
|
||
|
void OnEndOfFile() { Player_OnEndOfFile(); }
|
||
|
|
||
|
void OnError(NError code) { Player_OnError(code); }
|
||
|
|
||
|
void OnStopped() { Player_OnStopped(); }
|
||
|
|
||
|
void SetEqualizer(ifc_equalizer *equalizer) { return Player_SetEqualizer(equalizer); }
|
||
|
|
||
|
/* percent is 0-100. setting to 100 implies that buffering has finished */
|
||
|
void SetBufferStatus(int percent) { return Player_SetBufferStatus(percent); }
|
||
|
|
||
|
void OnSeekComplete(int error_code, double new_position) { return Player_OnSeekComplete(error_code, new_position); }
|
||
|
|
||
|
/* seekable is 0 (false) or 1 (true) */
|
||
|
void SetSeekable(int seekable) { return Player_SetSeekable(seekable); }
|
||
|
|
||
|
void AsynchronousFunctionCall(void (*function)(void *, void *, double), void *param1, void *param2, double real_param) { Player_AsynchronousFunctionCall(function, param1, param2, real_param); }
|
||
|
|
||
|
/* Call this after you've successfully opened and parsed the playback file, and are attempting to start playback */
|
||
|
void OnReady() { Player_OnReady(); };
|
||
|
|
||
|
/* Call this after EndOfFile() when either 1) You process an ifc_playback::Close() call or 2) ifc_audioout::IsPlaying() returns NErr_False while waiting for a Close() call */
|
||
|
void OnClosed() { Player_OnClosed(); };
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
DISPATCHABLE_VERSION,
|
||
|
};
|
||
|
protected:
|
||
|
virtual void WASABICALL Player_SetMetadata(ifc_metadata *metadata) = 0;
|
||
|
virtual void WASABICALL Player_SetBitrate(uint64_t bitrate, double timestamp) = 0;
|
||
|
virtual void WASABICALL Player_SetLength(double length) = 0;
|
||
|
virtual void WASABICALL Player_SetPosition(double timestamp) = 0;
|
||
|
virtual void WASABICALL Player_OnLoaded(nx_uri_t filename) = 0;
|
||
|
virtual void WASABICALL Player_OnEndOfFile() = 0;
|
||
|
virtual void WASABICALL Player_OnError(NError code) = 0;
|
||
|
virtual void WASABICALL Player_OnStopped()=0;
|
||
|
virtual void WASABICALL Player_SetEqualizer(ifc_equalizer *equalizer)=0;
|
||
|
virtual void WASABICALL Player_SetBufferStatus(int percent)=0;
|
||
|
virtual void WASABICALL Player_OnSeekComplete(int error_code, double new_position)=0;
|
||
|
virtual void WASABICALL Player_SetSeekable(int seekable)=0;
|
||
|
virtual void WASABICALL Player_AsynchronousFunctionCall(void (*function)(void *, void *, double), void *param1, void *param2, double real_param)=0;
|
||
|
virtual void WASABICALL Player_OnReady()=0;
|
||
|
virtual void WASABICALL Player_OnClosed()=0;
|
||
|
};
|