mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
Specifically: * Added win32, elf32 and elf64 asm player and wav writers using winmm. * Added dsound player in C. * Separated the ALL target and the examples; introduced a new examples target.
64 lines
1.6 KiB
C
64 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include "physics_girl_st.h"
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#define WIN32_EXTRA_LEAN
|
|
#include <Windows.h>
|
|
#include "mmsystem.h"
|
|
#include "mmreg.h"
|
|
|
|
SUsample sound_buffer[SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT];
|
|
HWAVEOUT wave_out_handle;
|
|
WAVEFORMATEX wave_format = {
|
|
#ifdef SU_SAMPLE_FLOAT
|
|
WAVE_FORMAT_IEEE_FLOAT,
|
|
#else
|
|
WAVE_FORMAT_PCM,
|
|
#endif
|
|
SU_CHANNEL_COUNT,
|
|
SU_SAMPLE_RATE,
|
|
SU_SAMPLE_RATE * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
|
SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
|
SU_SAMPLE_SIZE*8,
|
|
0
|
|
};
|
|
WAVEHDR wave_header = {
|
|
(LPSTR)sound_buffer,
|
|
SU_LENGTH_IN_SAMPLES * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
|
0,
|
|
0,
|
|
WHDR_PREPARED,
|
|
0,
|
|
0,
|
|
0
|
|
};
|
|
MMTIME mmtime = {
|
|
TIME_SAMPLES,
|
|
0
|
|
};
|
|
|
|
int main(int argc, char **args) {
|
|
// Load gm.dls if necessary.
|
|
#ifdef SU_LOAD_GMDLS
|
|
su_load_gmdls();
|
|
#endif // SU_LOAD_GMDLS
|
|
|
|
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)su_render_song, sound_buffer, 0, 0);
|
|
|
|
// We render in the background while playing already. Fortunately,
|
|
// Windows is slow with the calls below, so we're not worried that
|
|
// we don't have enough samples ready before the track starts.
|
|
waveOutOpen(&wave_out_handle, WAVE_MAPPER, &wave_format, 0, 0, CALLBACK_NULL);
|
|
waveOutWrite(wave_out_handle, &wave_header, sizeof(wave_header));
|
|
|
|
// We need to handle windows messages properly while playing, as waveOutWrite is async.
|
|
for(MSG msg = {0}; mmtime.u.sample != SU_LENGTH_IN_SAMPLES; waveOutGetPosition(wave_out_handle, &mmtime, sizeof(MMTIME))) {
|
|
while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessageA(&msg);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|