aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/replaygain/ifc_replaygain_settings.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/replaygain/ifc_replaygain_settings.h')
-rw-r--r--Src/replicant/replaygain/ifc_replaygain_settings.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/Src/replicant/replaygain/ifc_replaygain_settings.h b/Src/replicant/replaygain/ifc_replaygain_settings.h
new file mode 100644
index 00000000..5413dcb4
--- /dev/null
+++ b/Src/replicant/replaygain/ifc_replaygain_settings.h
@@ -0,0 +1,62 @@
+#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,
+ };
+};