add raw load support for win32

This commit is contained in:
Cary Sandvig 2000-10-05 21:53:11 +00:00
parent 3a18dd8181
commit 44f6bf9f14
4 changed files with 65 additions and 7 deletions

View File

@ -397,18 +397,23 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
#ifdef AUDIO_USE_WIN32
#include "audio_win_traits.h"
void AudioDestroySt(AudioTraits::SampleClass* sample) {
delete sample;
}
void AudioLoadSt(AudioTraits::SampleClass** sample,
AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) {
audio_cat->warning() << "win32 doesn't support reading raw data yet"
<< endl;
*sample = (AudioTraits::SampleClass*)0L;
*player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroySt;
AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
unsigned char* buf;
unsigned long len;
read_file(filename, &buf, len);
if (buf != (unsigned char*)0L) {
*sample = WinSample::load_raw(buf, len);
*player = WinPlayer::get_instance();
*destroy = AudioDestroySt;
}
}
#else /* AUDIO_USE_WIN32 */

View File

@ -78,6 +78,8 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
void AudioLoadWav(AudioTraits::SampleClass** sample,
AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) {
audio_cat->error() << "Linux driver does not natively support WAV."
<< " Try the 'st' loader." << endl;
*sample = new NullSample();
*player = new NullPlayer();
*destroy = AudioDestroyWav;

View File

@ -87,7 +87,7 @@ static void initialize(void) {
ZeroMemory(&wfx, sizeof(WAVEFORMATEX));
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = 22050;
wfx.nSamplesPerSec = audio_mix_freq;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = wfx.wBitsPerSample / 8 * wfx.nChannels;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
@ -393,6 +393,56 @@ WinSample* WinSample::load_wav(Filename filename) {
return ret;
}
WinSample* WinSample::load_raw(unsigned char* data, unsigned long size) {
WinSample* ret = (WinSample*)0L;
initialize();
// synth a wav header for this data
WAVEFORMATEX wavInfo;
ZeroMemory(&wavInfo, sizeof(WAVEFORMATEX));
wavInfo.wFormatTag = WAVE_FORMAT_PCM;
wavInfo.nChannels = 2;
wavInfo.nSamplesPerSec = audio_mix_freq;
wavInfo.wBitsPerSample = 16;
wavInfo.nBlockAlign = wavInfo.wBitsPerSample / 8 * wavInfo.nChannels;
wavInfo.nAvgBytesPerSec = wavInfo.nSamplesPerSec * wavInfo.nBlockAlign;
if (data = (unsigned char*)0L)
return ret;
// create a direct sound channel for this data
ret = new WinSample();
DSBUFFERDESC dsbdDesc;
ZeroMemory(&dsbdDesc, sizeof(DSBUFFERDESC));
dsbdDesc.dwSize = sizeof(DSBUFFERDESC);
dsbdDesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_GLOBALFOCUS;
dsbdDesc.dwBufferBytes = size;
dsbdDesc.lpwfxFormat = &wavInfo;
dsbdDesc.lpwfxFormat->cbSize = sizeof(wavInfo);
HRESULT result = soundDirectSound->CreateSoundBuffer(&dsbdDesc,
&(ret->_channel), NULL);
if (FAILED(result)) {
delete ret;
ret = (WinSample*)0L;
}
if (ret) {
BYTE* dst = NULL;
dst = ret->lock();
try {
memcpy(dst, data, size);
}
catch (...) {
delete ret;
ret = (WinSample*)0L;
}
if (ret)
ret->unlock();
delete [] data;
return ret;
}
}
void WinSample::destroy(AudioTraits::SampleClass* sample) {
delete sample;
}

View File

@ -32,6 +32,7 @@ public:
BYTE* lock(void);
void unlock(void);
static WinSample* load_wav(Filename);
static WinSample* load_raw(unsigned char*, unsigned long);
static void destroy(AudioTraits::SampleClass*);
// these are used by the player
INLINE LPDIRECTSOUNDBUFFER get_channel(void);