protected:
virtual BOOL ReadFrame(PINDEX amount);
virtual void CreateSilenceFrame(PINDEX amount); virtual void Synchronise(PINDEX amount); virtual BOOL IsWAVFileValid(PWAVFile *chan); BOOL AdjustFrame(void * buffer, PINDEX amount); PStringQueue playQueue;
MyH323Connection & conn; PMutex chanMutex; int silentCount; int totalData;
BOOL recordTrigger, hangupTrigger; BOOL closed; BOOL playOnce;
PAdaptiveDelay ogm_delay;
PBYTEArray frameBuffer; PINDEX frameLen, frameOffs; };
//这个是之读的文件是个g723编码的文件, 暂时不研究这个类相关的一切 class G7231_OGMChannel : public PCM_OGMChannel {
PCLASSINFO(G7231_OGMChannel, PCM_OGMChannel); public:
G7231_OGMChannel(MyH323Connection & conn); protected:
BOOL ReadFrame(PINDEX amount);
void CreateSilenceFrame(PINDEX amount); void Synchronise(PINDEX amount); BOOL IsWAVFileValid(PWAVFile *chan); };
//连接,都是从这个类实例出来的
class MyH323Connection : public H323Connection {
PCLASSINFO(MyH323Connection, H323Connection); public:
MyH323Connection(MyH323EndPoint &, unsigned); ~MyH323Connection();
// overrides from H323Connection
BOOL OpenAudioChannel(BOOL, unsigned, H323AudioCodec & codec);
AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323Si
gnalPDU &);
BOOL OnStartLogicalChannel(H323Channel & channel); void OnUserInputString(const PString & value); // new functions
void StartRecording(); void Hangup();
void SetE164Number(const PString & _num) { e164Number = _num; } PString GetE164Number() const { return e164Number; }
protected:
void OnUserInputChar(char ch); BOOL StartMenu(int menuNumber);
BOOL ProcessMenuCmd(const PString & cmdStr); const MyH323EndPoint & ep; PString product; PTime callStartTime; PTime recordStartTime; PString basename; PFilePath recordFn;
PString transmitCodecName, receiveCodecName; BOOL recordTrigger; PMutex connMutex;
PCM_RecordFile * recordFile; PCM_OGMChannel * ogmChannel; PString digits, lastDigits; int currentMenu;
PStringList menuNames;
PString securityToken, e164Number; };
//是录音
class PCM_RecordFile : public PIndirectChannel
{
PCLASSINFO(PCM_RecordFile, PIndirectChannel)
public:
PCM_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLim it);
~PCM_RecordFile();
BOOL Write(const void * buf, PINDEX len); BOOL Close();
void StartRecording();
virtual void DelayFrame(PINDEX len);
virtual BOOL WriteFrame(const void * buf, PINDEX len); BOOL WasRecordStarted() const { return recordStarted; } protected:
MyH323Connection & conn; PTime finishTime; PFilePath fn;
unsigned callLimit; BOOL recordStarted; BOOL timeLimitExceeded; BOOL closed; BOOL isPCM;
BOOL dataWritten; PAdaptiveDelay delay; PMutex pcmrecordMutex;
PFile *fileclass; // will point to a PWAVFile or PFile class };
//录的结果是个g723文件, 我们暂时不考虑这个类相关的一切 class G7231_RecordFile : public PCM_RecordFile {
PCLASSINFO(G7231_RecordFile, PCM_RecordFile);
public:
G7231_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callL imit);
void DelayFrame(PINDEX len);
BOOL WriteFrame(const void * buf, PINDEX len); };
#endif // _Voxilla_MAIN_H
// End of File
///////////////////////////////////////////////////////////////
这是main.cxx #include #include
#include \#include \#ifdef SPEEX_CODEC
#include \#endif
#include \#include \#include \PCREATE_PROCESS(OpenAm); #define new PNEW
//default 录音时间
#define DEFAULT_MSG_LIMIT 30
#define DEFAULT_CALL_LOG \#define G7231_SAMPLES_PER_BLOCK 240 #define CHECK_PCM 1 #define CHECK_G7231 2
#define MENU_PREFIX \
static PMutex logMutex; static PTextFile logFile;
static PFilePath logFilename = DEFAULT_CALL_LOG; PString G7231Ext = \PString WAVExt = \PString PCMExt = \
//关于log的一切先不用看
static void LogMessage(const PString & str) {
PTime now;
PString msg = now.AsString(\logMutex.Wait();
if (!logFile.IsOpen()) {
logFile.Open(logFilename, PFile::ReadWrite); logFile.SetPosition(0, PFile::End); }
logFile.WriteLine(msg); logFile.Close(); logMutex.Signal(); }
static void LogCall(const PFilePath & fn, const PString & from, const PString & user, unsigned len,
const PString & codec, const PString & product) {
PString addr = from;
LogMessage(addr & \& codec
& \}
/////////////////////////////////////////////////////////////// OpenAm::OpenAm()
: PProcess(\
MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER) { }
OpenAm::~OpenAm() { }