diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/ExtendedReader.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/ExtendedReader.cpp')
-rw-r--r-- | Src/Winamp/ExtendedReader.cpp | 87 |
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 |