87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
|
/** (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;
|