ghy
Alejandro Acuña
2025-03-12 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8
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
61
62
63
// ACMTransformer.h: interface for the ACMTransformer class.
//
//////////////////////////////////////////////////////////////////////
 
#ifndef AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_
#define AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_
 
#include <mmreg.h>
#include <Msacm.h>
#include <mmsystem.h>
#include <queue>
#include <list>
 
#include "AudioTransformer.h"
#include "Parameters.h"
 
#define ACMTRANSFORMER_NUM_STREAMHEADER 1
 
class ACMTransformer : public AudioTransformer
{
public:
    ACMTransformer();
    virtual ~ACMTransformer();
    SetSourceFormat(WAVEFORMATEX &wfxSource);
    SetDestinationFormat(WAVEFORMATEX &wfxDest);
    int TransformStarted();
    int TransformStopped();
    int SetOutputDuration(int millisecs);
    int FlushBuffer();
protected:
    virtual int TransformAudioSamples(std::vector<std::pair<AudioSample *, AudioSource *> > &data, AudioSample **ppAudioSample);
    virtual int SetTraceLevel();
    int         RenderAudioSamples(std::vector<std::pair<AudioSample *, AudioSource *> > &data);
    int         GenerateData(AudioSample **ppAudioSample);
private:
    ACMSTREAMHEADER     *GetBuffer();
    void                ReleaseBuffer(ACMSTREAMHEADER *acmHdr);
    bool                IsRunning();
    void                SetRunning(bool isRunning);
    int                 AddConvertedData(unsigned char *dataIn, int numBytes);
    static void CALLBACK ACMCallback(HACMSTREAM has, UINT uMsg, DWORD dwInstance, LPARAM lParam1, LPARAM lParam2);
private:
    WAVEFORMATEX        sourceFormat;
    WAVEFORMATEX        destFormat;
    HACMSTREAM          hACMStream;
    ACMSTREAMHEADER     acmStreamHeader[ACMTRANSFORMER_NUM_STREAMHEADER];
    unsigned char       sourceBuffer[ACMTRANSFORMER_NUM_STREAMHEADER][ACMTRANSFORMER_MAX_SOURCEBUFFERSIZE];
    unsigned char       destBuffer[ACMTRANSFORMER_NUM_STREAMHEADER][ACMTRANSFORMER_MAX_DESTBUFFERSIZE];
    std::queue<unsigned char> outputQueue;
    std::list<ACMSTREAMHEADER *> freeBuffers;
    CRITICAL_SECTION    outputQueueMutex;
    CRITICAL_SECTION    freeBuffersMutex;
    CRITICAL_SECTION    stateMutex;
    CRITICAL_SECTION    acmMutex;
    CRITICAL_SECTION    queryStateMutex;
    HANDLE              freeBuffersEvent;
    HANDLE              outputEnqueueEvent;
    HANDLE              outputDequeueEvent;
    int                 outputDuration;
    bool                bRunning;
};
 
#endif // !defined(AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_)