63 lines
2.6 KiB
C++
63 lines
2.6 KiB
C++
#pragma once
|
|
#include "foundation/dispatch.h"
|
|
|
|
/* ok, this could have easily been a config group, but I decided to make it its own interface for two reasons
|
|
1) it's a little more maintainable and easier to understand and use, rather than just using a generic key/value interface
|
|
2) the original ReplayGain specs suggests using the average gain of the last 10 played tracks in cases of missing replay gain data
|
|
http://replaygain.hydrogenaudio.org/proposal/player_scale.html
|
|
So we need a way to have the playback object pass along gain values so they can be averages in this way
|
|
|
|
*/
|
|
|
|
// {1CE24DEC-A189-4BC7-86A7-C6CDB0F8953D}
|
|
static const GUID replaygain_settings_interface_guid =
|
|
{ 0x1ce24dec, 0xa189, 0x4bc7, { 0x86, 0xa7, 0xc6, 0xcd, 0xb0, 0xf8, 0x95, 0x3d } };
|
|
|
|
class ifc_metadata;
|
|
|
|
class ifc_replaygain_settings : public Wasabi2::Dispatchable
|
|
{
|
|
protected:
|
|
ifc_replaygain_settings() : Wasabi2::Dispatchable(DISPATCHABLE_VERSION) {}
|
|
~ifc_replaygain_settings() {}
|
|
public:
|
|
static GUID GetInterfaceGUID() { return replaygain_settings_interface_guid; }
|
|
|
|
enum
|
|
{
|
|
REPLAYGAIN_OFF=0x0,
|
|
REPLAYGAIN_ON=0x1,
|
|
REPLAYGAIN_MODE_TRACK=0x2,
|
|
REPLAYGAIN_MODE_ALBUM=0x4,
|
|
REPLAYGAIN_MODE_MASK=REPLAYGAIN_MODE_TRACK|REPLAYGAIN_MODE_ALBUM,
|
|
REPLAYGAIN_PREVENT_CLIPPING=0x8,
|
|
REPLAYGAIN_AUTO=0x16, // automatically determine gain values for unscanned tracks from prior history
|
|
};
|
|
|
|
/* pass the ifc_metadata associated with the track
|
|
warning values:
|
|
NErr_Success: gain is set to the gain adjustment to play this track with
|
|
NErr_False: gain is set to the default gain adjustment because there was no metadata
|
|
NErr_Unknown: gain is set to the default gain adjustment, because the metadata object does not understand the ReplayGain metadata keys (MetadataKeys::TRACK_GAIN, etc)
|
|
|
|
return values:
|
|
NErr_Success: *gain has been assigned and is valid
|
|
NErr_Disabled: ReplayGain is turned off
|
|
*/
|
|
int GetGain(ifc_metadata *metadata, double *gain, int *warning) { return ReplayGainSettings_GetGain(metadata, gain, warning); }
|
|
|
|
/* Adds a track to the history, which is optionally used when playing back tracks without ReplayGain
|
|
pass the track length (or an estimate). Pass 0.0 for length if don't know.
|
|
You should only call this if GetGain returned NErr_Success and there was no warning!
|
|
*/
|
|
int AddToHistory(double seconds, double gain) { return ReplayGainSettings_AddToHistory(seconds, gain); }
|
|
private:
|
|
virtual int WASABICALL ReplayGainSettings_GetGain(ifc_metadata *metadata, double *gain, int *warning)=0;
|
|
virtual int WASABICALL ReplayGainSettings_AddToHistory(double seconds, double gain)=0;
|
|
|
|
enum
|
|
{
|
|
DISPATCHABLE_VERSION,
|
|
};
|
|
};
|