mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-05 22:20:30 -04:00
121 lines
No EOL
2.6 KiB
C++
121 lines
No EOL
2.6 KiB
C++
#ifndef __SKELDAL_MUSIC_
|
|
#define __SKELDAL_MUSIC_
|
|
|
|
#include "WAPlayer.h"
|
|
|
|
#define DWORD_PTR DWORD *
|
|
#include <dsound.h>
|
|
|
|
|
|
class MusicPlayer: public IWAOutput
|
|
{
|
|
DWORD _speed; //speed relative to sampling frequence;
|
|
bool _stereo; //true, if stereo
|
|
bool _bit16; //true, if 16 bits
|
|
bool _opened;
|
|
IDirectSoundBuffer8 *_ds8Buffer;
|
|
DWORD _lastWritePos; //last write pos;
|
|
DWORD _minorpos;
|
|
int *_linvoltable;
|
|
DWORD _crossfadebytes;
|
|
unsigned char _volume;
|
|
CRITICAL_SECTION _lock;
|
|
bool _paused;
|
|
|
|
DWORD GetSafeXFadePos();
|
|
|
|
public:
|
|
MusicPlayer();
|
|
~MusicPlayer();
|
|
|
|
HRESULT InitBuffer(IDirectSound8 *ds8, int *linvoltable);
|
|
HRESULT Play();
|
|
HRESULT Done();
|
|
int Open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms);
|
|
void Close();
|
|
int Write(const char *buf, int len);
|
|
int CanWrite();
|
|
int IsPlaying();
|
|
void SetVolume(int volume);
|
|
void SetPan(int pan) {}
|
|
void Flush(int t) {}
|
|
int GetOutputTime() {return 1;}
|
|
int GetWrittenTime() {return 1;}
|
|
uint32_t AddRef() {return 1;}
|
|
uint32_t Release() {return 1;}
|
|
int Pause(int pause);
|
|
bool IsOpenned() {return _opened;}
|
|
};
|
|
|
|
#pragma pack (1)
|
|
struct MusFileHeader
|
|
{
|
|
short channels;
|
|
int32_t freq;
|
|
int32_t ssize;
|
|
int32_t blocks;
|
|
int32_t reserved1;
|
|
int32_t reserved2;
|
|
short ampltable[256];
|
|
};
|
|
#pragma pack()
|
|
|
|
|
|
class IDecoder
|
|
{
|
|
public:
|
|
virtual void AttachOutput(IWAOutput *o)=0;
|
|
virtual bool Play(const char *filename)=0;
|
|
virtual bool IsPlaying()=0;
|
|
virtual void Stop()=0;
|
|
virtual void SetVolume(int volume, int main)=0;
|
|
virtual bool NotUsingOutput()=0;
|
|
virtual ~IDecoder() {}
|
|
};
|
|
|
|
class MusDecoder: public IDecoder
|
|
{
|
|
MusFileHeader _header;
|
|
bool _playing;
|
|
HANDLE _thread;
|
|
IWAOutput *_output;
|
|
HANDLE _file;
|
|
bool _stop;
|
|
|
|
|
|
static DWORD WINAPI StartMusDecoder(LPVOID data);
|
|
static DWORD WINAPI StartSilentWritter(LPVOID data);
|
|
UINT MusDecodingThread();
|
|
UINT SilentWritterThread();
|
|
public:
|
|
MusDecoder();
|
|
~MusDecoder();
|
|
|
|
void AttachOutput(IWAOutput *o);
|
|
|
|
bool Play(const char *filename);
|
|
void Stop();
|
|
bool IsPlaying() {return _playing;}
|
|
void SetVolume(int volume, int main) {if (_output) _output->SetVolume(volume);}
|
|
bool NotUsingOutput() {return false;}
|
|
};
|
|
|
|
class WinAmpDecoder: public IDecoder, public WAPlayer
|
|
{
|
|
IWAOutput *_output;
|
|
WAInputPlugin *_currPlugin;
|
|
bool _nooutput;
|
|
public:
|
|
WinAmpDecoder();
|
|
~WinAmpDecoder();
|
|
|
|
void AttachOutput(IWAOutput *o);
|
|
bool Play(const char *filename);
|
|
void Stop();
|
|
bool IsPlaying();
|
|
void SetVolume(int volume, int main);
|
|
bool NotUsingOutput() {return _nooutput;}
|
|
};
|
|
|
|
|
|
#endif |