mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 23:02:03 +00:00
Further audiolib work... I think this is almost done!
git-svn-id: https://svn.eduke32.com/eduke32@8219 1a8010ca-5511-0410-912e-c29ae57300e0 # Conflicts: # GNUmakefile # platform/Windows/audiolib.vcxproj # platform/Windows/audiolib.vcxproj.filters # platform/Windows/build.vcxproj # platform/Windows/build.vcxproj.filters # source/audiolib/include/al_midi.h # source/audiolib/src/_al_midi.h # source/duke3d/src/osdcmds.cpp # source/duke3d/src/sounds.cpp
This commit is contained in:
parent
8a1681fb5a
commit
8eb5233232
21 changed files with 1087 additions and 264 deletions
|
@ -25,8 +25,8 @@
|
|||
#include "midifuncs.h"
|
||||
|
||||
extern int ASS_PCMSoundDriver;
|
||||
extern int ASS_CDSoundDriver;
|
||||
extern int ASS_MIDISoundDriver;
|
||||
extern int ASS_EMIDICard;
|
||||
|
||||
int SoundDriver_IsPCMSupported(int driver);
|
||||
int SoundDriver_IsMIDISupported(int driver);
|
||||
|
|
|
@ -32,7 +32,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#define FX_MAN_H_
|
||||
|
||||
#include "drivers.h"
|
||||
#include "inttypes.h"
|
||||
#include <inttypes.h>
|
||||
#include "limits.h"
|
||||
#include "multivoc.h"
|
||||
|
||||
|
|
|
@ -61,15 +61,15 @@ typedef struct
|
|||
|
||||
extern const char *MUSIC_ErrorString(int ErrorNumber);
|
||||
|
||||
int MUSIC_Init(int SoundCard);
|
||||
int MUSIC_Shutdown(void);
|
||||
void MUSIC_SetVolume(int volume);
|
||||
int MUSIC_GetVolume(void);
|
||||
void MUSIC_SetLoopFlag(int loopflag);
|
||||
void MUSIC_Continue(void);
|
||||
void MUSIC_Pause(void);
|
||||
int MUSIC_StopSong(void);
|
||||
int MUSIC_PlaySong(char *song, int songsize, int loopflag, const char *fn = nullptr);
|
||||
void MUSIC_Update(void);
|
||||
int MUSIC_Init(int SoundCard, int ForceEMIDI = -1);
|
||||
int MUSIC_Shutdown(void);
|
||||
void MUSIC_SetVolume(int volume);
|
||||
int MUSIC_GetVolume(void);
|
||||
void MUSIC_SetLoopFlag(int loopflag);
|
||||
void MUSIC_Continue(void);
|
||||
void MUSIC_Pause(void);
|
||||
int MUSIC_StopSong(void);
|
||||
int MUSIC_PlaySong(char *song, int songsize, int loopflag, const char *fn = nullptr);
|
||||
void MUSIC_Update(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,8 +36,8 @@ typedef enum
|
|||
ASS_NoSound,
|
||||
ASS_SDL,
|
||||
ASS_DirectSound,
|
||||
ASS_WinMM,
|
||||
ASS_OPL3,
|
||||
ASS_WinMM,
|
||||
ASS_NumSoundCards,
|
||||
ASS_AutoDetect = -2
|
||||
} soundcardnames;
|
||||
|
|
|
@ -25,11 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#define ___MIDI_H
|
||||
#include "compat.h"
|
||||
|
||||
#ifdef OPL_MIDI_HEADER
|
||||
namespace OPLMusic {
|
||||
#endif
|
||||
#define RELATIVE_BEAT( measure, beat, tick ) \
|
||||
( ( tick ) + ( ( beat ) << 9 ) + ( ( measure ) << 16 ) )
|
||||
#define RELATIVE_BEAT(measure, beat, tick) ((tick) + ((beat) << 9) + ((measure) << 16))
|
||||
|
||||
//Bobby Prince thinks this may be 100
|
||||
//#define GENMIDI_DefaultVolume 100
|
||||
|
@ -105,7 +101,7 @@ namespace OPLMusic {
|
|||
|
||||
#define EMIDI_GeneralMIDI 0
|
||||
#define EMIDI_SoundBlaster 4
|
||||
#define EMIDI_Adlib 7
|
||||
#define EMIDI_AdLib 7
|
||||
|
||||
#define EMIDI_AffectsCurrentCard(c, type) (((c) == EMIDI_ALL_CARDS) || ((c) == (type)))
|
||||
#define EMIDI_NUM_CONTEXTS 7
|
||||
|
@ -145,19 +141,16 @@ typedef struct
|
|||
char EMIDI_VolumeChange;
|
||||
} track;
|
||||
|
||||
static int _MIDI_ReadNumber(void *from, size_t size);
|
||||
static int _MIDI_ReadDelta(track *ptr);
|
||||
static int _MIDI_ReadNumber(void *from, size_t size);
|
||||
static int _MIDI_ReadDelta(track *ptr);
|
||||
static void _MIDI_ResetTracks(void);
|
||||
static void _MIDI_AdvanceTick(void);
|
||||
static void _MIDI_MetaEvent(track *Track);
|
||||
static void _MIDI_SysEx(track *Track);
|
||||
static int _MIDI_InterpretControllerInfo(track *Track, int TimeSet, int channel, int c1, int c2);
|
||||
static int _MIDI_SendControlChange(int channel, int c1, int c2);
|
||||
static int _MIDI_InterpretControllerInfo(track *Track, int TimeSet, int channel, int c1, int c2);
|
||||
static int _MIDI_SendControlChange(int channel, int c1, int c2);
|
||||
static void _MIDI_SetChannelVolume(int channel, int volume);
|
||||
static void _MIDI_SendChannelVolumes(void);
|
||||
static void _MIDI_InitEMIDI(void);
|
||||
|
||||
#ifdef OPL_MIDI_HEADER
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -18,15 +18,16 @@
|
|||
|
||||
*/
|
||||
|
||||
#include "al_midi.h"
|
||||
#include "midifuncs.h"
|
||||
#include "opl3.h"
|
||||
|
||||
int AdlibDrv_GetError(void);
|
||||
const char *AdlibDrv_ErrorString( int ErrorNumber );
|
||||
int AdLibDrv_GetError(void);
|
||||
const char *AdLibDrv_ErrorString(int ErrorNumber);
|
||||
|
||||
int AdLibDrv_MIDI_Init(midifuncs *);
|
||||
void AdLibDrv_MIDI_Shutdown(void);
|
||||
int AdLibDrv_MIDI_StartPlayback(void (*service)(void));
|
||||
void AdLibDrv_MIDI_HaltPlayback(void);
|
||||
void AdLibDrv_MIDI_SetTempo(int tempo, int division);
|
||||
|
||||
int AdlibDrv_MIDI_Init(midifuncs *);
|
||||
void AdlibDrv_MIDI_Shutdown(void);
|
||||
int AdlibDrv_MIDI_StartPlayback(void (*service)(void));
|
||||
void AdlibDrv_MIDI_HaltPlayback(void);
|
||||
void AdlibDrv_MIDI_SetTempo(int tempo, int division);
|
||||
void AdlibDrv_MIDI_Lock(void);
|
||||
void AdlibDrv_MIDI_Unlock(void);
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
*/
|
||||
|
||||
#include "inttypes.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
enum
|
||||
{
|
||||
|
|
|
@ -98,7 +98,7 @@ int SDLDrv_GetError(void)
|
|||
return ErrorCode;
|
||||
}
|
||||
|
||||
const char *SDLDrv_ErrorString( int ErrorNumber )
|
||||
const char *SDLDrv_ErrorString(int ErrorNumber)
|
||||
{
|
||||
const char *ErrorString;
|
||||
|
||||
|
@ -173,7 +173,7 @@ int SDLDrv_PCM_Init(int *mixrate, int *numchannels, void * initdata)
|
|||
#if (SDL_MAJOR_VERSION == 1)
|
||||
err = !SDL_OpenAudio(&spec, &actual);
|
||||
#else
|
||||
audio_dev = err = SDL_OpenAudioDevice(NULL, 0, &spec, &actual, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
|
||||
audio_dev = err = SDL_OpenAudioDevice(nullptr, 0, &spec, &actual, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
|
||||
#endif
|
||||
|
||||
if (err == 0) {
|
||||
|
@ -186,12 +186,25 @@ int SDLDrv_PCM_Init(int *mixrate, int *numchannels, void * initdata)
|
|||
SDL_AudioDriverName(drivername, sizeof(drivername));
|
||||
MV_Printf("SDL %s driver\n", drivername);
|
||||
#else
|
||||
char *drivername = Xstrdup(SDL_GetCurrentAudioDriver());
|
||||
auto drivername = Xstrdup(SDL_GetCurrentAudioDriver());
|
||||
|
||||
for (int i=0;drivername[i] != 0;++i)
|
||||
drivername[i] = toupperlookup[drivername[i]];
|
||||
|
||||
MV_Printf("SDL %s driver on %s\n", drivername ? drivername : "(error)", SDL_GetAudioDeviceName(0, 0));
|
||||
auto devname = Xstrdup(SDL_GetAudioDeviceName(0, 0));
|
||||
auto pdevname = Bstrchr(devname, '(');
|
||||
|
||||
if (pdevname)
|
||||
{
|
||||
auto rt = Bstrchr(pdevname++, ')');
|
||||
if (rt != nullptr) *rt = '\0';
|
||||
}
|
||||
else
|
||||
pdevname = devname;
|
||||
|
||||
MV_Printf("SDL %s driver on %s\n", drivername, pdevname);
|
||||
|
||||
Xfree(devname);
|
||||
Xfree(drivername);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -649,7 +649,7 @@ static DWORD WINAPI midiDataThread(LPVOID lpParameter)
|
|||
DWORD sequenceTime;
|
||||
DWORD sleepAmount = 100 / THREAD_QUEUE_INTERVAL;
|
||||
|
||||
MV_Printf("WinMM midiDataThread: started\n");
|
||||
// MV_Printf("WinMM midiDataThread: started\n");
|
||||
|
||||
midiThreadTimer = midi_get_tick();
|
||||
midiLastEventTime = midiThreadTimer;
|
||||
|
@ -669,7 +669,7 @@ static DWORD WINAPI midiDataThread(LPVOID lpParameter)
|
|||
do {
|
||||
waitret = WaitForSingleObject(midiThreadQuitEvent, sleepAmount);
|
||||
if (waitret == WAIT_OBJECT_0) {
|
||||
MV_Printf("WinMM midiDataThread: exiting\n");
|
||||
// MV_Printf("WinMM midiDataThread: exiting\n");
|
||||
break;
|
||||
} else if (waitret == WAIT_TIMEOUT) {
|
||||
// queue a tick
|
||||
|
@ -712,7 +712,7 @@ int WinMMDrv_MIDI_StartPlayback(void (*service)(void))
|
|||
|
||||
midiThreadService = service;
|
||||
|
||||
midiThreadQuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
midiThreadQuitEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
||||
if (!midiThreadQuitEvent) {
|
||||
ErrorCode = WinMMErr_MIDICreateEvent;
|
||||
return WinMMErr_Error;
|
||||
|
@ -730,7 +730,7 @@ int WinMMDrv_MIDI_StartPlayback(void (*service)(void))
|
|||
midiStreamRunning = TRUE;
|
||||
}
|
||||
|
||||
midiThread = CreateThread(NULL, 0, midiDataThread, 0, 0, 0);
|
||||
midiThread = CreateThread(nullptr, 0, midiDataThread, 0, 0, 0);
|
||||
if (!midiThread) {
|
||||
WinMMDrv_MIDI_HaltPlayback();
|
||||
ErrorCode = WinMMErr_MIDIPlayThread;
|
||||
|
@ -748,7 +748,7 @@ void WinMMDrv_MIDI_HaltPlayback(void)
|
|||
SetEvent(midiThreadQuitEvent);
|
||||
|
||||
WaitForSingleObject(midiThread, INFINITE);
|
||||
MV_Printf("WinMM MIDI_HaltPlayback synched\n");
|
||||
// MV_Printf("WinMM MIDI_HaltPlayback synched\n");
|
||||
|
||||
CloseHandle(midiThread);
|
||||
}
|
||||
|
@ -758,12 +758,12 @@ void WinMMDrv_MIDI_HaltPlayback(void)
|
|||
}
|
||||
|
||||
if (midiStreamRunning) {
|
||||
MV_Printf("stopping stream\n");
|
||||
// MV_Printf("stopping stream\n");
|
||||
rv = midiStreamStop(midiStream);
|
||||
if (rv != MMSYSERR_NOERROR) {
|
||||
midi_error(rv, "WinMM MIDI_HaltPlayback midiStreamStop");
|
||||
}
|
||||
MV_Printf("stream stopped\n");
|
||||
// MV_Printf("stream stopped\n");
|
||||
|
||||
midiStreamRunning = FALSE;
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
int ASS_PCMSoundDriver = ASS_AutoDetect;
|
||||
int ASS_MIDISoundDriver = ASS_AutoDetect;
|
||||
int ASS_EMIDICard = -1;
|
||||
|
||||
#define UNSUPPORTED_PCM 0,0,0,0,0,0
|
||||
#define UNSUPPORTED_MIDI 0,0,0,0,0,0,0
|
||||
|
@ -68,7 +69,7 @@ static struct {
|
|||
|
||||
// Everyone gets the "no sound" driver
|
||||
{
|
||||
"No Sound",
|
||||
"null sound device",
|
||||
NoSoundDrv_GetError,
|
||||
NoSoundDrv_ErrorString,
|
||||
NoSoundDrv_PCM_Init,
|
||||
|
@ -103,9 +104,9 @@ static struct {
|
|||
#else
|
||||
UNSUPPORTED_COMPLETELY
|
||||
#endif
|
||||
|
||||
|
||||
// Windows DirectSound
|
||||
#ifdef _WIN32
|
||||
#ifdef RENDERTYPEWIN
|
||||
{
|
||||
"DirectSound",
|
||||
DirectSoundDrv_GetError,
|
||||
|
@ -122,6 +123,23 @@ static struct {
|
|||
UNSUPPORTED_COMPLETELY
|
||||
#endif
|
||||
|
||||
// OPL3 emulation
|
||||
{
|
||||
"Nuked OPL3 AdLib emulator",
|
||||
AdLibDrv_GetError,
|
||||
AdLibDrv_ErrorString,
|
||||
|
||||
UNSUPPORTED_PCM,
|
||||
|
||||
AdLibDrv_MIDI_Init,
|
||||
AdLibDrv_MIDI_Shutdown,
|
||||
AdLibDrv_MIDI_StartPlayback,
|
||||
AdLibDrv_MIDI_HaltPlayback,
|
||||
AdLibDrv_MIDI_SetTempo,
|
||||
nullptr,
|
||||
nullptr,
|
||||
},
|
||||
|
||||
// Windows MultiMedia system
|
||||
#ifdef _WIN32
|
||||
{
|
||||
|
@ -142,23 +160,6 @@ static struct {
|
|||
#else
|
||||
UNSUPPORTED_COMPLETELY
|
||||
#endif
|
||||
|
||||
// OPL3 emulation
|
||||
{
|
||||
"Nuked OPL3",
|
||||
AdlibDrv_GetError,
|
||||
AdlibDrv_ErrorString,
|
||||
|
||||
UNSUPPORTED_PCM,
|
||||
|
||||
AdlibDrv_MIDI_Init,
|
||||
AdlibDrv_MIDI_Shutdown,
|
||||
AdlibDrv_MIDI_StartPlayback,
|
||||
AdlibDrv_MIDI_HaltPlayback,
|
||||
AdlibDrv_MIDI_SetTempo,
|
||||
AdlibDrv_MIDI_Lock,
|
||||
AdlibDrv_MIDI_Unlock,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
@ -223,7 +224,7 @@ int SoundDriver_MIDI_StartPlayback(void (*service)(void)) { return SoundDrivers
|
|||
void SoundDriver_MIDI_Shutdown(void) { SoundDrivers[ASS_MIDISoundDriver].MIDI_Shutdown(); }
|
||||
void SoundDriver_MIDI_HaltPlayback(void) { SoundDrivers[ASS_MIDISoundDriver].MIDI_HaltPlayback(); }
|
||||
void SoundDriver_MIDI_SetTempo(int tempo, int division) { SoundDrivers[ASS_MIDISoundDriver].MIDI_SetTempo(tempo, division); }
|
||||
void SoundDriver_MIDI_Lock(void) { SoundDrivers[ASS_MIDISoundDriver].MIDI_Lock(); }
|
||||
void SoundDriver_MIDI_Unlock(void) { SoundDrivers[ASS_MIDISoundDriver].MIDI_Unlock(); }
|
||||
void SoundDriver_MIDI_Lock(void) { if (SoundDrivers[ASS_MIDISoundDriver].MIDI_Lock) SoundDrivers[ASS_MIDISoundDriver].MIDI_Lock(); }
|
||||
void SoundDriver_MIDI_Unlock(void) { if (SoundDrivers[ASS_MIDISoundDriver].MIDI_Unlock) SoundDrivers[ASS_MIDISoundDriver].MIDI_Unlock(); }
|
||||
|
||||
// vim:ts=4:sw=4:expandtab:
|
||||
|
|
|
@ -54,7 +54,7 @@ int FX_Init(int numvoices, int numchannels, unsigned mixrate, void *initdata)
|
|||
if (SoundCard == ASS_AutoDetect) {
|
||||
#if defined RENDERTYPESDL
|
||||
SoundCard = ASS_SDL;
|
||||
#elif defined _WIN32
|
||||
#elif defined RENDERTYPEWIN
|
||||
SoundCard = ASS_DirectSound;
|
||||
#else
|
||||
SoundCard = ASS_NoSound;
|
||||
|
|
|
@ -19,22 +19,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "_al_midi.h"
|
||||
|
||||
namespace OPLMusic {
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t SAVEK[ 2 ];
|
||||
uint8_t Level[ 2 ];
|
||||
uint8_t Env1[ 2 ];
|
||||
uint8_t Env2[ 2 ];
|
||||
uint8_t Wave[ 2 ];
|
||||
uint8_t Feedback;
|
||||
int8_t Transpose;
|
||||
int8_t Velocity;
|
||||
} TIMBRE;
|
||||
|
||||
TIMBRE ADLIB_TimbreBank[ 256 ] =
|
||||
AdLibTimbre ADLIB_TimbreBank[256] =
|
||||
{
|
||||
{ { 33, 33 }, { 143, 6 }, { 242, 242 }, { 69, 118 }, { 0, 0 }, 8, 0, 0 },
|
||||
{ { 49, 33 }, { 75, 0 }, { 242, 242 }, { 84, 86 }, { 0, 0 }, 8, 0, 0 },
|
||||
|
@ -293,5 +280,3 @@ TIMBRE ADLIB_TimbreBank[ 256 ] =
|
|||
{ { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35, 0 },
|
||||
{ { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35, 0 }
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -38,12 +38,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
#include "_midi.h"
|
||||
#include "_multivc.h"
|
||||
#include "al_midi.h"
|
||||
#include "compat.h"
|
||||
#include "multivoc.h"
|
||||
#include "music.h"
|
||||
#include "pragmas.h"
|
||||
#include "sndcards.h"
|
||||
#include "driver_adlib.h"
|
||||
|
||||
extern int MV_MixRate;
|
||||
extern int ASS_MIDISoundDriver;
|
||||
|
@ -86,8 +86,6 @@ static midifuncs *_MIDI_Funcs;
|
|||
|
||||
static int _MIDI_Reset;
|
||||
|
||||
static int MIDI_Tempo = 120;
|
||||
|
||||
int MV_MIDIRenderTempo = -1;
|
||||
int MV_MIDIRenderTimer;
|
||||
|
||||
|
@ -270,7 +268,7 @@ static int _MIDI_InterpretControllerInfo(track *Track, int TimeSet, int channel,
|
|||
|
||||
case EMIDI_CONTEXT_END :
|
||||
if ((Track->currentcontext == _MIDI_Context) || (_MIDI_Context < 0) ||
|
||||
(Track->context[_MIDI_Context].pos == NULL))
|
||||
(Track->context[_MIDI_Context].pos == nullptr))
|
||||
break;
|
||||
|
||||
Track->currentcontext = _MIDI_Context;
|
||||
|
@ -333,7 +331,7 @@ static int _MIDI_InterpretControllerInfo(track *Track, int TimeSet, int channel,
|
|||
|
||||
case EMIDI_LOOP_END :
|
||||
case EMIDI_SONG_LOOP_END :
|
||||
if ((c2 != EMIDI_END_LOOP_VALUE) || (Track->context[0].loopstart == NULL) || (Track->context[0].loopcount == 0))
|
||||
if ((c2 != EMIDI_END_LOOP_VALUE) || (Track->context[0].loopstart == nullptr) || (Track->context[0].loopcount == 0))
|
||||
break;
|
||||
|
||||
if (c1 == EMIDI_SONG_LOOP_END)
|
||||
|
@ -507,9 +505,30 @@ static void _MIDI_ServiceRoutine(void)
|
|||
_MIDI_GlobalPositionInTicks++;
|
||||
}
|
||||
|
||||
static void _MIDI_ServiceMultivoc(void)
|
||||
{
|
||||
int16_t * buffer16 = (int16_t *)MV_MusicBuffer;
|
||||
int const samples = MV_BufferSize >> 2;
|
||||
|
||||
for (int i = 0; i < samples; i++)
|
||||
{
|
||||
Bit16s buf[2];
|
||||
while (MV_MIDIRenderTimer >= MV_MixRate)
|
||||
{
|
||||
if (MV_MIDIRenderTempo >= 0)
|
||||
_MIDI_ServiceRoutine();
|
||||
MV_MIDIRenderTimer -= MV_MixRate;
|
||||
}
|
||||
if (MV_MIDIRenderTempo >= 0) MV_MIDIRenderTimer += MV_MIDIRenderTempo;
|
||||
OPL3_GenerateResampled(AL_GetChip(), buf);
|
||||
*buffer16++ = clamp(buf[0]<<1, INT16_MIN, INT16_MAX);
|
||||
*buffer16++ = clamp(buf[1]<<1, INT16_MIN, INT16_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
static int _MIDI_SendControlChange(int channel, int c1, int c2)
|
||||
{
|
||||
if (_MIDI_Funcs == NULL || _MIDI_Funcs->ControlChange == NULL)
|
||||
if (_MIDI_Funcs == nullptr || _MIDI_Funcs->ControlChange == nullptr)
|
||||
return MIDI_Error;
|
||||
|
||||
_MIDI_Funcs->ControlChange(channel, c1, c2);
|
||||
|
@ -517,6 +536,16 @@ static int _MIDI_SendControlChange(int channel, int c1, int c2)
|
|||
return MIDI_Ok;
|
||||
}
|
||||
|
||||
static int _MIDI_SendProgramChange(int channel, int c1)
|
||||
{
|
||||
if (_MIDI_Funcs == nullptr || _MIDI_Funcs->ProgramChange == nullptr)
|
||||
return MIDI_Error;
|
||||
|
||||
_MIDI_Funcs->ProgramChange(channel, c1);
|
||||
|
||||
return MIDI_Ok;
|
||||
}
|
||||
|
||||
int MIDI_AllNotesOff(void)
|
||||
{
|
||||
SoundDriver_MIDI_Lock();
|
||||
|
@ -536,9 +565,9 @@ int MIDI_AllNotesOff(void)
|
|||
|
||||
static void _MIDI_SetChannelVolume(int channel, int volume)
|
||||
{
|
||||
_MIDI_ChannelVolume[ channel ] = volume;
|
||||
_MIDI_ChannelVolume[channel] = volume;
|
||||
|
||||
if (_MIDI_Funcs == NULL || _MIDI_Funcs->ControlChange == NULL)
|
||||
if (_MIDI_Funcs == nullptr || _MIDI_Funcs->ControlChange == nullptr)
|
||||
return;
|
||||
|
||||
volume *= _MIDI_TotalVolume;
|
||||
|
@ -566,7 +595,13 @@ int MIDI_Reset(void)
|
|||
_MIDI_SendControlChange(channel, MIDI_RPN_LSB, MIDI_PITCHBEND_LSB);
|
||||
_MIDI_SendControlChange(channel, MIDI_DATAENTRY_MSB, 2); /* Pitch Bend Sensitivity MSB */
|
||||
_MIDI_SendControlChange(channel, MIDI_DATAENTRY_LSB, 0); /* Pitch Bend Sensitivity LSB */
|
||||
_MIDI_ChannelVolume[ channel ] = GENMIDI_DefaultVolume;
|
||||
_MIDI_ChannelVolume[channel] = GENMIDI_DefaultVolume;
|
||||
_MIDI_SendControlChange(channel, MIDI_PAN, 64); // begin TURRICAN's recommendation
|
||||
_MIDI_SendControlChange(channel, MIDI_REVERB, 40);
|
||||
_MIDI_SendControlChange(channel, MIDI_CHORUS, 0);
|
||||
_MIDI_SendControlChange(channel, MIDI_BANK_SELECT_MSB, 0);
|
||||
_MIDI_SendControlChange(channel, MIDI_BANK_SELECT_LSB, 0);
|
||||
_MIDI_SendProgramChange(channel, 0); // end TURRICAN's recommendation
|
||||
}
|
||||
|
||||
_MIDI_SendChannelVolumes();
|
||||
|
@ -581,7 +616,7 @@ int MIDI_Reset(void)
|
|||
|
||||
int MIDI_SetVolume(int volume)
|
||||
{
|
||||
if (_MIDI_Funcs == NULL)
|
||||
if (_MIDI_Funcs == nullptr)
|
||||
return MIDI_NullMidiModule;
|
||||
|
||||
volume = min(MIDI_MaxVolume, volume);
|
||||
|
@ -604,7 +639,7 @@ int MIDI_SetVolume(int volume)
|
|||
|
||||
int MIDI_GetVolume(void)
|
||||
{
|
||||
if (_MIDI_Funcs == NULL)
|
||||
if (_MIDI_Funcs == nullptr)
|
||||
return MIDI_NullMidiModule;
|
||||
|
||||
SoundDriver_MIDI_Lock();
|
||||
|
@ -668,7 +703,7 @@ int MIDI_PlaySong(char *song, int loopflag)
|
|||
track *CurrentTrack;
|
||||
char *ptr;
|
||||
|
||||
if (_MIDI_Funcs == NULL)
|
||||
if (_MIDI_Funcs == nullptr)
|
||||
return MIDI_NullMidiModule;
|
||||
|
||||
if (B_UNBUF32(song) != MIDI_HEADER_SIGNATURE)
|
||||
|
@ -723,7 +758,6 @@ int MIDI_PlaySong(char *song, int loopflag)
|
|||
if (_MIDI_SongLoaded)
|
||||
MIDI_StopSong();
|
||||
|
||||
|
||||
_MIDI_Loop = loopflag;
|
||||
_MIDI_NumTracks = My_MIDI_NumTracks;
|
||||
_MIDI_Division = My_MIDI_Division;
|
||||
|
@ -738,15 +772,10 @@ int MIDI_PlaySong(char *song, int loopflag)
|
|||
|
||||
_MIDI_Reset = FALSE;
|
||||
|
||||
if (ASS_MIDISoundDriver == ASS_OPL3)
|
||||
{
|
||||
MV_MIDIRenderTempo = 100;
|
||||
MV_MIDIRenderTimer = 0;
|
||||
}
|
||||
|
||||
MIDI_SetTempo(120);
|
||||
|
||||
if (SoundDriver_MIDI_StartPlayback(ASS_MIDISoundDriver == ASS_OPL3 ? MV_RenderMIDI : _MIDI_ServiceRoutine) != MIDI_Ok)
|
||||
// this can either stay like this, or I can add another field to the MIDI driver spec that holds the service callback
|
||||
if (SoundDriver_MIDI_StartPlayback(ASS_MIDISoundDriver == ASS_OPL3 ? _MIDI_ServiceMultivoc : _MIDI_ServiceRoutine) != MIDI_Ok)
|
||||
return MIDI_DriverError;
|
||||
|
||||
_MIDI_SongLoaded = TRUE;
|
||||
|
@ -757,19 +786,11 @@ int MIDI_PlaySong(char *song, int loopflag)
|
|||
|
||||
void MIDI_SetTempo(int tempo)
|
||||
{
|
||||
MIDI_Tempo = tempo;
|
||||
SoundDriver_MIDI_SetTempo(tempo, _MIDI_Division);
|
||||
int const tickspersecond = tempo * _MIDI_Division / 60;
|
||||
_MIDI_FPSecondsPerTick = tabledivide32_noinline(1 << TIME_PRECISION, tickspersecond);
|
||||
}
|
||||
|
||||
void MIDI_SetDivision(int division)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(division);
|
||||
}
|
||||
|
||||
int MIDI_GetTempo(void) { return MIDI_Tempo; }
|
||||
|
||||
static void _MIDI_InitEMIDI(void)
|
||||
{
|
||||
int type = EMIDI_GeneralMIDI;
|
||||
|
@ -777,10 +798,13 @@ static void _MIDI_InitEMIDI(void)
|
|||
switch (ASS_MIDISoundDriver)
|
||||
{
|
||||
case ASS_OPL3:
|
||||
type = EMIDI_Adlib;
|
||||
type = EMIDI_SoundBlaster;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ASS_EMIDICard != -1)
|
||||
type = ASS_EMIDICard;
|
||||
|
||||
_MIDI_ResetTracks();
|
||||
|
||||
_MIDI_TotalTime = 0;
|
||||
|
@ -791,7 +815,7 @@ static void _MIDI_InitEMIDI(void)
|
|||
track *Track = _MIDI_TrackPtr;
|
||||
int tracknum = 0;
|
||||
|
||||
while ((tracknum < _MIDI_NumTracks) && (Track != NULL))
|
||||
while ((tracknum < _MIDI_NumTracks) && (Track != nullptr))
|
||||
{
|
||||
_MIDI_Tick = 0;
|
||||
_MIDI_Beat = 1;
|
||||
|
@ -894,7 +918,7 @@ static void _MIDI_InitEMIDI(void)
|
|||
case EMIDI_SONG_LOOP_END :
|
||||
if (c2 == EMIDI_END_LOOP_VALUE)
|
||||
{
|
||||
Track->context[ 0 ].loopstart = NULL;
|
||||
Track->context[ 0 ].loopstart = nullptr;
|
||||
Track->context[ 0 ].loopcount = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -983,30 +1007,3 @@ static void _MIDI_InitEMIDI(void)
|
|||
_MIDI_ResetTracks();
|
||||
}
|
||||
|
||||
void MV_RenderMIDI(void)
|
||||
{
|
||||
int16_t * buffer16 = (int16_t *)MV_MusicBuffer;
|
||||
int const samples = MV_BufferSize >> 2;
|
||||
|
||||
for (int i = 0; i < samples; i++)
|
||||
{
|
||||
Bit16s buf[2];
|
||||
while (MV_MIDIRenderTimer >= MV_MixRate)
|
||||
{
|
||||
if (MV_MIDIRenderTempo >= 0)
|
||||
_MIDI_ServiceRoutine();
|
||||
MV_MIDIRenderTimer -= MV_MixRate;
|
||||
}
|
||||
if (MV_MIDIRenderTempo >= 0) MV_MIDIRenderTimer += MV_MIDIRenderTempo;
|
||||
OPL3_GenerateResampled(&OPLMusic::chip, buf);
|
||||
*buffer16++ = clamp(buf[0]<<1, INT16_MIN, INT16_MAX);
|
||||
*buffer16++ = clamp(buf[1]<<1, INT16_MIN, INT16_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MIDI_UpdateMusic(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -65,9 +65,5 @@ void MIDI_PauseSong(void);
|
|||
void MIDI_StopSong(void);
|
||||
int MIDI_PlaySong(char *song, int loopflag);
|
||||
void MIDI_SetTempo(int tempo);
|
||||
int MIDI_GetTempo(void);
|
||||
void MV_RenderMIDI(void);
|
||||
void MIDI_UpdateMusic(void);
|
||||
void MIDI_SetDivision(int division);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -909,7 +909,7 @@ void MV_UnhookMusicRoutine(void)
|
|||
if (MV_MusicCallback)
|
||||
{
|
||||
MV_Lock();
|
||||
MV_MusicCallback = NULL;
|
||||
MV_MusicCallback = nullptr;
|
||||
MV_MixMusic = FALSE;
|
||||
MV_Unlock();
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
#include "music.h"
|
||||
|
||||
#include "al_midi.h"
|
||||
#include "compat.h"
|
||||
#include "drivers.h"
|
||||
#include "midi.h"
|
||||
|
@ -55,7 +54,7 @@ const char *MUSIC_ErrorString(int ErrorNumber)
|
|||
}
|
||||
|
||||
|
||||
int MUSIC_Init(int SoundCard)
|
||||
int MUSIC_Init(int SoundCard, int EMIDICard /*= -1*/)
|
||||
{
|
||||
int detected = 0;
|
||||
|
||||
|
@ -63,14 +62,7 @@ int MUSIC_Init(int SoundCard)
|
|||
{
|
||||
redetect:
|
||||
detected++;
|
||||
|
||||
#if defined _WIN32
|
||||
SoundCard = ASS_WinMM;
|
||||
#elif RENDERTYPESDL
|
||||
SoundCard = ASS_SDL;
|
||||
#else
|
||||
SoundCard = ASS_NoSound;
|
||||
#endif
|
||||
SoundCard = ASS_OPL3;
|
||||
}
|
||||
|
||||
if (SoundCard < 0 || SoundCard >= ASS_NumSoundCards)
|
||||
|
@ -92,6 +84,7 @@ failed:
|
|||
}
|
||||
|
||||
ASS_MIDISoundDriver = SoundCard;
|
||||
ASS_EMIDICard = EMIDICard;
|
||||
|
||||
int status = SoundDriver_MIDI_Init(&MUSIC_MidiFunctions);
|
||||
|
||||
|
@ -103,7 +96,7 @@ failed:
|
|||
goto failed;
|
||||
}
|
||||
|
||||
MV_Printf("successfully initialized %s!\n", SoundDriver_GetName(SoundCard));
|
||||
MV_Printf("%s\n", SoundDriver_GetName(SoundCard));
|
||||
|
||||
MIDI_SetMidiFuncs(&MUSIC_MidiFunctions);
|
||||
|
||||
|
@ -154,5 +147,4 @@ int MUSIC_PlaySong(char *song, int songsize, int loopflag, const char *fn /*= nu
|
|||
|
||||
void MUSIC_Update(void)
|
||||
{
|
||||
MIDI_UpdateMusic();
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ int MUSIC_Init(int SoundCard)
|
|||
g_musicPlayerCommandLine = getenv("EDUKE32_MUSIC_CMD");
|
||||
|
||||
UNREFERENCED_PARAMETER(SoundCard);
|
||||
UNREFERENCED_PARAMETER(Address);
|
||||
|
||||
if (g_musicPlayerReady)
|
||||
{
|
||||
|
@ -126,7 +125,7 @@ int MUSIC_Init(int SoundCard)
|
|||
}
|
||||
g_musicFileNameArgvPos = numargs;
|
||||
g_musicPlayerArgv[numargs] = g_musicFileName;
|
||||
g_musicPlayerArgv[numargs+1] = NULL;
|
||||
g_musicPlayerArgv[numargs+1] = nullptr;
|
||||
|
||||
#if 0
|
||||
if (mprotect(g_musicPlayerArgv, sz, PROT_READ)==-1) // make argv and command string read-only
|
||||
|
@ -151,44 +150,6 @@ int MUSIC_Shutdown(void)
|
|||
return MUSIC_Ok;
|
||||
} // MUSIC_Shutdown
|
||||
|
||||
|
||||
void MUSIC_SetMaxFMMidiChannel(int channel)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(channel);
|
||||
} // MUSIC_SetMaxFMMidiChannel
|
||||
|
||||
int MUSIC_Volume;
|
||||
|
||||
void MUSIC_SetVolume(int volume)
|
||||
{
|
||||
volume = max(0, volume);
|
||||
volume = min(volume, 255);
|
||||
|
||||
MUSIC_Volume = volume;
|
||||
} // MUSIC_SetVolume
|
||||
|
||||
|
||||
int MUSIC_GetVolume(void)
|
||||
{
|
||||
return MUSIC_Volume;
|
||||
} // MUSIC_GetVolume
|
||||
|
||||
|
||||
void MUSIC_SetLoopFlag(int loopflag)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(loopflag);
|
||||
} // MUSIC_SetLoopFlag
|
||||
|
||||
|
||||
void MUSIC_Continue(void)
|
||||
{
|
||||
} // MUSIC_Continue
|
||||
|
||||
|
||||
void MUSIC_Pause(void)
|
||||
{
|
||||
} // MUSIC_Pause
|
||||
|
||||
int MUSIC_StopSong(void)
|
||||
{
|
||||
if (!g_musicPlayerEnabled)
|
||||
|
@ -205,9 +166,9 @@ int MUSIC_StopSong(void)
|
|||
ts.tv_nsec = 5000000; // sleep 5ms at most
|
||||
|
||||
kill(g_musicPlayerHandle, SIGTERM);
|
||||
nanosleep(&ts, NULL);
|
||||
nanosleep(&ts, nullptr);
|
||||
|
||||
if (int ret = waitpid(g_musicPlayerHandle, NULL, WNOHANG|WUNTRACED) != g_musicPlayerHandle)
|
||||
if (int ret = waitpid(g_musicPlayerHandle, nullptr, WNOHANG|WUNTRACED) != g_musicPlayerHandle)
|
||||
{
|
||||
if (ret==-1)
|
||||
initprintf("%s: waitpid: %s\n", __func__, strerror(errno));
|
||||
|
@ -218,7 +179,7 @@ int MUSIC_StopSong(void)
|
|||
|
||||
initprintf("%s: SIGTERM timed out--trying SIGKILL\n", __func__);
|
||||
|
||||
if (waitpid(g_musicPlayerHandle, NULL, WUNTRACED)==-1)
|
||||
if (waitpid(g_musicPlayerHandle, nullptr, WUNTRACED)==-1)
|
||||
initprintf("%s: waitpid: %s\n", __func__, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
@ -241,7 +202,7 @@ static int MUSIC_PlayExternal()
|
|||
ZeroMemory(&pi,sizeof(pi));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
if (!CreateProcess(NULL,g_musicPlayerCommandLine,NULL,NULL,0,0,NULL,NULL,&si,&pi))
|
||||
if (!CreateProcess(nullptr,g_musicPlayerCommandLine,nullptr,nullptr,0,0,nullptr,nullptr,&si,&pi))
|
||||
{
|
||||
MV_Printf("%s: CreateProcess: %s\n", __func__, windowsGetErrorMessage(GetLastError()));
|
||||
return MUSIC_Error;
|
||||
|
@ -310,7 +271,7 @@ int MUSIC_PlaySong(char *song, int songsize, int loopflag, const char *fn /*= nu
|
|||
sa.sa_flags=0;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
||||
if (sigaction(SIGCHLD, &sa, NULL)==-1)
|
||||
if (sigaction(SIGCHLD, &sa, nullptr)==-1)
|
||||
initprintf("%s: sigaction: %s\n", __func__, strerror(errno));
|
||||
|
||||
sigchld_handler_set = 1;
|
||||
|
|
|
@ -31,7 +31,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#ifndef PITCH_H_
|
||||
#define PITCH_H_
|
||||
|
||||
#include "inttypes.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
uint32_t PITCH_GetScale(int pitchoffset);
|
||||
#endif
|
||||
|
|
|
@ -1166,16 +1166,16 @@ static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont,
|
|||
#endif
|
||||
|
||||
static char const *MEOSN_SOUND_MUSICDEVICE[] = {
|
||||
"OPL3",
|
||||
#ifdef _WIN32
|
||||
"Windows",
|
||||
#endif
|
||||
"OPL3",
|
||||
};
|
||||
static int32_t MEOSV_SOUND_MUSICDEVICE[] = {
|
||||
ASS_OPL3,
|
||||
#ifdef _WIN32
|
||||
ASS_WinMM,
|
||||
#endif
|
||||
ASS_OPL3,
|
||||
};
|
||||
|
||||
static MenuOptionSet_t MEOS_SOUND_MUSICDEVICE = MAKE_MENUOPTIONSET( MEOSN_SOUND_MUSICDEVICE, MEOSV_SOUND_MUSICDEVICE, 0x2 );
|
||||
|
|
|
@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
#include "duke3d.h"
|
||||
#include "renderlayer.h" // for win_gethwnd()
|
||||
#include "al_midi.h"
|
||||
#include <atomic>
|
||||
|
||||
#include "vfs.h"
|
||||
|
@ -117,6 +118,19 @@ void S_MusicStartup(void)
|
|||
if (MUSIC_Init(ud.config.MusicDevice) == MUSIC_Ok || MUSIC_Init(0) == MUSIC_Ok || MUSIC_Init(1) == MUSIC_Ok)
|
||||
{
|
||||
MUSIC_SetVolume(mus_volume);
|
||||
|
||||
// TODO: figure out why this produces garbage output
|
||||
#if 0
|
||||
if (auto fil = kopen4load("d3dtimbr.tmb", 0) != -1)
|
||||
{
|
||||
int l = kfilelength(fil);
|
||||
auto tmb = (uint8_t *)Xmalloc(l);
|
||||
kread(fil, tmb, l);
|
||||
OPLMusic::AL_RegisterTimbreBank(tmb);
|
||||
Xfree(tmb);
|
||||
kclose(fil);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue