Skip to content

Commit

Permalink
xaudio2: Rewrite I/O for new FACTFileIOCallbacks support
Browse files Browse the repository at this point in the history
  • Loading branch information
flibitijibibo authored and aeikum committed Dec 20, 2018
1 parent 27dbd35 commit 478f3c4
Showing 1 changed file with 50 additions and 56 deletions.
106 changes: 50 additions & 56 deletions dlls/xaudio2_7/xact_dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,39 @@ typedef struct _XACT3EngineImpl {
IXACT3Engine IXACT3Engine_iface;

FACTAudioEngine *fact_engine;

XACT_READFILE_CALLBACK pReadFile;
XACT_GETOVERLAPPEDRESULT_CALLBACK pGetOverlappedResult;
} XACT3EngineImpl;

typedef struct wrap_readfile_struct {
XACT3EngineImpl *engine;
HANDLE file;
} wrap_readfile_struct;

static int32_t FACTCALL wrap_readfile(
void* hFile,
void* lpBuffer,
uint32_t nNumberOfBytesRead,
uint32_t *lpNumberOfBytesRead,
FACTOverlapped *lpOverlapped
) {
wrap_readfile_struct *wrap = (wrap_readfile_struct*) hFile;
return wrap->engine->pReadFile(wrap->file, lpBuffer, nNumberOfBytesRead,
lpNumberOfBytesRead, lpOverlapped);
}

static int32_t FACTCALL wrap_getoverlappedresult(
void* hFile,
FACTOverlapped *lpOverlapped,
uint32_t *lpNumberOfBytesTransferred,
int32_t bWait
) {
wrap_readfile_struct *wrap = (wrap_readfile_struct*) hFile;
return wrap->engine->pGetOverlappedResult(wrap->file, lpOverlapped,
lpNumberOfBytesTransferred, bWait);
}

static inline XACT3CueImpl *impl_from_IXACT3Cue(IXACT3Cue *iface)
{
return CONTAINING_RECORD(iface, XACT3CueImpl, IXACT3Cue_iface);
Expand Down Expand Up @@ -966,6 +997,19 @@ static HRESULT WINAPI IXACT3EngineImpl_Initialize(IXACT3Engine *iface,
}
}

/* Force Windows I/O, do NOT use the FACT default! */
This->pReadFile = (XACT_READFILE_CALLBACK)
pParams->fileIOCallbacks.readFileCallback;
This->pGetOverlappedResult = (XACT_GETOVERLAPPEDRESULT_CALLBACK)
pParams->fileIOCallbacks.getOverlappedResultCallback;
if (This->pReadFile == NULL)
This->pReadFile = (XACT_READFILE_CALLBACK) ReadFile;
if (This->pGetOverlappedResult == NULL)
This->pGetOverlappedResult = (XACT_GETOVERLAPPEDRESULT_CALLBACK)
GetOverlappedResult;
params.fileIOCallbacks.readFileCallback = wrap_readfile;
params.fileIOCallbacks.getOverlappedResultCallback = wrap_getoverlappedresult;

return FACTAudioEngine_Initialize(This->fact_engine, &params);
}

Expand Down Expand Up @@ -1053,74 +1097,24 @@ static HRESULT WINAPI IXACT3EngineImpl_CreateInMemoryWaveBank(IXACT3Engine *ifac
return hr;
}

static size_t wrap_io_read(
void *data,
void *dst,
size_t size,
size_t count
) {
DWORD byte_read;
OVERLAPPED overlapped = {0};
if (!ReadFile((HANDLE) data, dst, size * count, &byte_read, &overlapped))
{
return 0;
}
return byte_read;
}

static int64_t wrap_io_seek(void *data, int64_t offset, int whence)
{
DWORD windowswhence = 0;
LARGE_INTEGER windowsoffset;
HANDLE io = (HANDLE) data;

switch (whence)
{
case FAUDIO_SEEK_SET:
windowswhence = FILE_BEGIN;
break;
case FAUDIO_SEEK_CUR:
windowswhence = FILE_CURRENT;
break;
case FAUDIO_SEEK_END:
windowswhence = FILE_END;
break;
}

windowsoffset.QuadPart = offset;
if (!SetFilePointerEx(io, windowsoffset, &windowsoffset, windowswhence))
{
return -1;
}
return windowsoffset.QuadPart;
}

static int wrap_io_close(void *data)
{
CloseHandle((HANDLE) data);
return 0;
}

static HRESULT WINAPI IXACT3EngineImpl_CreateStreamingWaveBank(IXACT3Engine *iface,
const XACT_STREAMING_PARAMETERS *pParms,
IXACT3WaveBank **ppWaveBank)
{
XACT3EngineImpl *This = impl_from_IXACT3Engine(iface);
FACTStreamingParameters fakeParms;
wrap_readfile_struct *fake;
XACT3WaveBankImpl *wb;
FAudioIOStream *fake;
FACTWaveBank *fwb;
HRESULT hr;

TRACE("(%p)->(%p, %p)\n", This, pParms, ppWaveBank);

/* We have to wrap the file around an IOStream first! */
fake = (FAudioIOStream*) CoTaskMemAlloc(
sizeof(FAudioIOStream));
fake->data = pParms->file;
fake->read = wrap_io_read;
fake->seek = wrap_io_seek;
fake->close = wrap_io_close;
/* We have to wrap the file to fix up the callbacks! */
fake = (wrap_readfile_struct*) CoTaskMemAlloc(
sizeof(wrap_readfile_struct));
fake->engine = This;
fake->file = pParms->file;
fakeParms.file = fake;
fakeParms.flags = pParms->flags;
fakeParms.offset = pParms->offset;
Expand Down

0 comments on commit 478f3c4

Please sign in to comment.