aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/ExtendedReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/ExtendedReader.cpp')
-rw-r--r--Src/Winamp/ExtendedReader.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/Src/Winamp/ExtendedReader.cpp b/Src/Winamp/ExtendedReader.cpp
new file mode 100644
index 00000000..3565be1f
--- /dev/null
+++ b/Src/Winamp/ExtendedReader.cpp
@@ -0,0 +1,87 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author: Ben Allison benski@nullsoft.com
+ ** Created:
+ **/
+#include "main.h"
+#include "ExtendedReader.h"
+#include "../nu/AutoCharFn.h"
+
+ExtendedReader::ExtendedReader(OpenFunc _open, OpenWFunc _openW, OpenFunc _openFloat, OpenWFunc _openWFloat, GetDataFunc _getData, CloseFunc _close, SetTimeFunc _setTime)
+ : open(_open), openFloat(_openFloat), openW(_openW), openWFloat(_openWFloat), getData(_getData), close(_close), setTime(_setTime), handle(0)
+{}
+
+bool ExtendedReader::Open(const wchar_t *filename, AudioParameters *parameters)
+{
+ if (parameters->flags & AUDIOPARAMETERS_FLOAT)
+ {
+ if (this->openWFloat)
+ handle = this->openWFloat(filename, (int *) & parameters->sizeBytes, (int *) & parameters->bitsPerSample, (int *) & parameters->channels, (int *) & parameters->sampleRate);
+ else if (this->openFloat)
+ handle = this->openFloat(AutoCharFn(filename), (int *) & parameters->sizeBytes, (int *) & parameters->bitsPerSample, (int *) & parameters->channels, (int *) & parameters->sampleRate);
+ }
+ else
+ {
+ if (this->openW)
+ handle = this->openW(filename, (int *) & parameters->sizeBytes, (int *) & parameters->bitsPerSample, (int *) & parameters->channels, (int *) & parameters->sampleRate);
+ else
+ handle = this->open(AutoCharFn(filename), (int *) & parameters->sizeBytes, (int *) & parameters->bitsPerSample, (int *) & parameters->channels, (int *) & parameters->sampleRate);
+ }
+ if (handle > 0)
+ return true;
+ else
+ {
+ if (handle == -1)
+ parameters->errorCode = API_DECODEFILE_FAIL_NO_WARN;
+ else
+ parameters->errorCode = API_DECODEFILE_FAILURE;
+ return false;
+ }
+}
+
+size_t ExtendedReader::ReadAudio(void *buffer, size_t sizeBytes)
+{
+ int killswitch = 0;
+ return this->getData(handle, buffer, sizeBytes, &killswitch);
+}
+
+size_t ExtendedReader::ReadAudio_kill(void *buffer, size_t sizeBytes, int *killswitch, int *error)
+{
+ *error=0;
+ intptr_t ret = this->getData(handle, buffer, sizeBytes, killswitch);
+ if (ret < 0)
+ {
+ *error=1;
+ return 0;
+ }
+ else
+ return static_cast<size_t>(ret);
+}
+
+BOOL ExtendedReader::SeekToTimeMs(int millisecs)
+{
+ if (!setTime)
+ return FALSE;
+ return this->setTime(handle, millisecs);
+}
+
+int ExtendedReader::CanSeek()
+{
+ return setTime?1:0;
+}
+
+ExtendedReader::~ExtendedReader()
+{
+ if (handle)
+ this->close(handle);
+}
+
+#define CBCLASS ExtendedReader
+START_DISPATCH;
+CB(IFC_AUDIOSTREAM_READAUDIO, ReadAudio)
+CB(IFC_AUDIOSTREAM_READAUDIO2, ReadAudio_kill)
+CB(IFC_AUDIOSTREAM_SEEKTOTIMEMS, SeekToTimeMs)
+CB(IFC_AUDIOSTREAM_CANSEEK, CanSeek)
+END_DISPATCH; \ No newline at end of file