Alejandro Acuña
2024-08-12 1876e65234c20209001178705cfa50d8f9ded67a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// WaveAudioSink.h: interface for the WaveAudioSink class.
//
//////////////////////////////////////////////////////////////////////
 
#ifndef AFX_WAVEAUDIOSINK_H__82B1217D_28FD_4C8A_B8FA_ADF13478A7CF__INCLUDED_
#define AFX_WAVEAUDIOSINK_H__82B1217D_28FD_4C8A_B8FA_ADF13478A7CF__INCLUDED_
 
#include <windows.h>
#include <mmsystem.h>
#include <list>
 
#include "AudioSink.h"
#include "Parameters.h"
 
class WaveAudioSink : public AudioSink
{
public:
    WaveAudioSink();
    virtual ~WaveAudioSink();
    virtual int SinkStarted();
    virtual int SinkStopped();
    virtual int SinkThreadStarted(HANDLE sinkThreadHandle, DWORD sinkThreadID);
    virtual int SinkThreadStopped(HANDLE sinkThreadHandle, DWORD sinkThreadID);
 
    int SetVolume(unsigned long volume);
    int SetDeviceID(unsigned int deviceID);
    unsigned int GetDeviceID();
    int SetFrameSize(unsigned long size);
    int SetNumFrames(unsigned long numFrames);
    int SetFormat(int waveFormatNumber);
 
protected:
    virtual int RenderAudioSamples(std::vector<std::pair<AudioSample *, AudioSource *> > &data);
    virtual int SetTraceLevel();
private:
    int BeginAudioRender();
    int EndAudioRender();
    int ResetAudioRender();
    WAVEHDR *GetBuffer();
    static void CALLBACK SpeakerCallback(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
 
private:
    bool                enabled;
    bool                bRunning;
    unsigned long       frameSize;
    unsigned long       numFrames;
    unsigned int        waveoutDeviceID;
    HANDLE              dataEvent;
    HWAVEOUT            hWaveOut;
    WAVEHDR             waveHdr[WAVESINK_MAX_WAVEHDR];
    WAVEFORMATEX        wfx;
    char                dataBuffer[WAVESINK_MAX_WAVEHDR][WAVESINK_MAX_WAVEHDR_SIZE];
    std::list<WAVEHDR*> freeBuffers;
    HANDLE              pauseEvent;
    CRITICAL_SECTION    dataMutex;
    CRITICAL_SECTION    freeBuffersMutex;
    CRITICAL_SECTION    filterMutex;
};
 
#endif // !defined(AFX_WAVEAUDIOSINK_H__82B1217D_28FD_4C8A_B8FA_ADF13478A7CF__INCLUDED_)