//Copyright+LGPL
//-----------------------------------------------------------------------------------------------------------------------------------------------
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
//-----------------------------------------------------------------------------------------------------------------------------------------------
// This file is part of MMVARI.
// MMVARI is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
// MMVARI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see
// .
//-----------------------------------------------------------------------------------------------------------------------------------------------
#ifndef WAVE_H
#define WAVE_H
//---------------------------------------------------------------------------
#include
#include "mmw.h"
#include "ComLib.h"
//---------------------------------------------------------------------------
#ifndef PROC
#define PROC(Key) ((t##Key)GetProc("_" #Key))
#endif
//---------------------------------------------------------------------------
class CXWave
{
private:
AnsiString m_ItemName;
//HANDLE m_hLib; //ja7ude 0522
HINSTANCE m_hLib;
UINT m_nTimerID;
tmmwPumpMessages fmmwPumpMessages;
tmmwGetTimeout fmmwGetTimeout;
tmmwSetPTT fmmwSetPTT;
tmmwInOpen fmmwInOpen;
tmmwInClose fmmwInClose;
tmmwInRead fmmwInRead;
tmmwGetInExist fmmwGetInExist;
tmmwIsInCritical fmmwIsInCritical;
tmmwOutOpen fmmwOutOpen;
tmmwOutAbort fmmwOutAbort;
tmmwOutFlush fmmwOutFlush;
tmmwOutWrite fmmwOutWrite;
tmmwIsOutCritical fmmwIsOutCritical;
tmmwIsOutFull fmmwIsOutFull;
tmmwGetOutRemaining fmmwGetOutRemaining;
tmmwGetOutCounter fmmwGetOutCounter;
tmmwSetOutCounter fmmwSetOutCounter;
private:
FARPROC __fastcall GetProc(LPCSTR pName);
void __fastcall FreeLib(void);
public:
__fastcall CXWave(LPCSTR pName);
__fastcall ~CXWave(void);
inline BOOL __fastcall IsLib(void){return m_hLib != NULL;};
BOOL __fastcall IsNameChange(void);
public:
BOOL __fastcall InOpen(int sampfreq, int size);
void __fastcall InClose(void);
BOOL __fastcall InRead(SHORT *p);
int __fastcall GetInBC(void);
int __fastcall IsInBufCritical(void);
BOOL __fastcall OutOpen(int sampfreq, int size);
void __fastcall OutFlush(void);
void __fastcall OutAbort(void);
BOOL __fastcall OutWrite(const SHORT *p);
// inline void __fastcall OutClose(void){OutFlush(); OutAbort();};
int __fastcall GetOutBC(void);
int __fastcall GetOutBCC(void);
void __fastcall SetOutBCC(int count);
int __fastcall IsOutBufCritical(void);
int __fastcall IsOutBufFull(void);
void __fastcall SetPTT(int tx);
int __fastcall GetTimeout(void);
void __fastcall PumpMessages(void);
};
//---------------------------------------------------------------------------
//#define WM_WAVE WM_USER+400
#define WAVE_TIMEOUT_EVENT 2000 // バッファリクエストのタイムアウト
#define WAVE_FIFO_MAX 32 // 循環バッファの最大個数
//---------------------------------------------------------------------------
class CWave
{
friend void CALLBACK WaveInProc(HWAVE m_hin, UINT uMsg, CWave* pWave, DWORD dwParam1, DWORD dwParam2 );
friend void CALLBACK WaveOutProc(HWAVE m_hout, UINT uMsg, CWave* pWave, DWORD dwParam1, DWORD dwParam2 );
public:
HWND m_hWnd;
int m_InFifoSize;
int m_OutFifoSize;
int m_SoundStereo;
int m_SoundID;
int m_SoundTxID;
int m_InDevs;
int m_OutDevs;
AnsiString m_tInDevName[16];
AnsiString m_tOutDevName[16];
private:
volatile int m_InBC;
volatile int m_OutBC;
volatile int m_OutBCC;
private:
LPWAVEHDR m_pInBuff[WAVE_FIFO_MAX]; // 入力バッファ
LPWAVEHDR m_pOutBuff[WAVE_FIFO_MAX]; // 出力バッファ
WAVEFORMATEX m_OWFX; // 出力フォーマット
WAVEFORMATEX m_IWFX; // 入力フォーマット
CRITICAL_SECTION m_InCS;
CRITICAL_SECTION m_OutCS;
HANDLE m_InEvent;
HANDLE m_OutEvent;
BOOL m_InWait;
BOOL m_InOver;
BOOL m_OutWait;
BOOL m_OutUnder;
int m_InWP;
int m_InRP;
int m_OutWP;
int m_OutRP;
int m_Error;
BOOL m_InOpen;
BOOL m_OutOpen;
LPSTR m_pInBase;
LPSTR m_pOutBase;
int m_InLen;
int m_InBuffSize;
int m_InMemSize;
int m_InAllocSize;
int m_OutLen;
int m_OutBuffSize;
int m_OutMemSize;
int m_OutAllocSize;
BOOL m_OutFirst;
//HWAVE m_hin;
//HWAVE m_hout; //ja7ude 0522
HWAVEIN m_hin;
HWAVEOUT m_hout;
BOOL m_fPTT;
CXWave *m_pDLL;
private:
public:
__fastcall CWave(void);
__fastcall ~CWave();
// BOOL __fastcall IsFormatSupported(LPWAVEFORMATEX pWFX, UINT IDDevice);
BOOL __fastcall InOpen(LPWAVEFORMATEX pWFX, UINT IDDevice, DWORD Size);
inline __fastcall BOOL IsInOpen(){return m_InOpen;};
BOOL __fastcall InRead(SHORT *pData);
void __fastcall InClose();
BOOL __fastcall OutOpen(LPWAVEFORMATEX pWFX, UINT IDDevice, DWORD Size);
inline __fastcall BOOL IsOutOpen(){return m_OutOpen;};
BOOL __fastcall OutWrite(const SHORT *pData);
void __fastcall OutFlush();
void __fastcall OutAbort();
void __fastcall OutClose(){OutFlush();OutAbort();};
// DWORD __fastcall GetOutVolume(void);
// BOOL __fastcall SetOutVolume(DWORD vol);
#if 0
inline int __fastcall IsInBufCritical(void){
return ( m_InBC >= (m_InFifoSize/2) ) ? 1 : 0;
}
inline int __fastcall IsOutBufCritical(void){
return (m_OutBC <= (m_OutFifoSize/2)) ? 1 : 0;
}
inline int __fastcall IsOutBufFull(void){
return (m_OutBC >= m_OutFifoSize) ? 1 : 0;
};
inline void __fastcall SetOutBCC(int count){
m_OutBCC = count;
};
inline int __fastcall GetOutBCC(void){
return m_OutBCC;
};
inline int __fastcall GetOutBC(void){
return m_OutBC;
};
#else
BOOL __fastcall IsOutFirst(void);
inline int __fastcall IsInBufNull(void){return !GetInBC();};
int __fastcall GetInBC(void);
int __fastcall GetOutBC(void);
int __fastcall GetOutBCC(void);
void __fastcall SetOutBCC(int count);
int __fastcall IsInBufCritical(void);
int __fastcall IsOutBufCritical(void);
int __fastcall IsOutBufFull(void);
void __fastcall SetPTT(LONG tx);
int __fastcall GetTimeout(void);
void __fastcall GetDeviceList(void);
void __fastcall SetSoundID(int &rxID, int &txID);
void __fastcall SetSoundID(void){
SetSoundID(m_SoundID, m_SoundTxID);
}
void __fastcall UpdateDevice(int ID);
void __fastcall PumpMessages(void);
#endif
inline BOOL __fastcall IsPTT(void){return m_fPTT;};
void __fastcall GetInDevName(AnsiString &as);
void __fastcall GetOutDevName(AnsiString &as);
};
//---------------------------------------------------------------------------
class CWaveFile
{
private:
HMMIO m_Handle;
int m_dis;
BYTE m_Head[4];
private:
void __fastcall SetName(void);
public:
long m_length;
long m_pos;
int m_mode;
int m_pause;
int m_autopause;
AnsiString m_FileName;
AnsiString m_Name;
int m_SampType;
public:
__fastcall CWaveFile();
__fastcall ~CWaveFile();
void __fastcall FileClose(void);
void __fastcall Rec(LPCSTR pName);
BOOL __fastcall Play(LPCSTR pName);
void __fastcall Rewind(void);
void __fastcall ReadWrite(short *s, int size);
long __fastcall GetPos(void);
void __fastcall Seek(int n);
int __fastcall ChangeSampFreq(LPCSTR tName, LPCSTR pName, int sSamp);
};
//---------------------------------------------------------------------------
class CWaveStrage
{
private:
HMMIO m_Handle;
AnsiString m_FileName;
public:
long m_pos;
long m_wpos;
long m_rpos;
short *pData;
short *pSync;
__fastcall CWaveStrage();
__fastcall ~CWaveStrage(){Close();};
void __fastcall Close(void);
void __fastcall Open(void);
void __fastcall RInit(void);
void __fastcall WInit(void);
int __fastcall IsOpen(void){return m_Handle != NULL ? TRUE : FALSE;};
void __fastcall Read(short *sp, int size);
void __fastcall Write(short *sp, int size);
void __fastcall Seek(int n);
};
//---------------------------------------------------------------------------
#endif