From ed8f28e552ce1135a631ce78054124acb48d2df8 Mon Sep 17 00:00:00 2001 From: fcolin Date: Thu, 1 Feb 2007 13:06:32 +0000 Subject: Utilisateur : Fcolin Date : 10/02/04 Heure : 17:06 Créé Commentaire: (vss 1) --- IvyAudioMon/MeterDlg.cpp | 358 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 IvyAudioMon/MeterDlg.cpp (limited to 'IvyAudioMon') diff --git a/IvyAudioMon/MeterDlg.cpp b/IvyAudioMon/MeterDlg.cpp new file mode 100644 index 0000000..2962d7b --- /dev/null +++ b/IvyAudioMon/MeterDlg.cpp @@ -0,0 +1,358 @@ +// MeterDlg.cpp : implementation file +// + +#include "stdafx.h" +#include // abs, __max +#include +#include "Meter.h" +#include "MeterDlg.h" +#include "ParseCmdLine.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif +const char * CONVSTR( const CString& str ) +{ +#ifdef UNDER_CE + + static char buffer[4096]; + int len = str.GetLength(); + buffer[len] = '\0'; + if ( len ) + { + int err = WideCharToMultiByte( CP_ACP, 0, str, len, buffer, 4096, NULL, NULL ); + if ( err == 0 ) + TRACE(TEXT("Error converting chars %d\n"),GetLastError()); + } + return buffer; +#else + return (LPCSTR) str; +#endif + +} +///////////////////////////////////////////////////////////////////////////// +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialog +{ +public: + CAboutDlg(); + +// Dialog Data + //{{AFX_DATA(CAboutDlg) + enum { IDD = IDD_ABOUTBOX }; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAboutDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + //{{AFX_MSG(CAboutDlg) + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) +{ + //{{AFX_DATA_INIT(CAboutDlg) + //}}AFX_DATA_INIT +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAboutDlg) + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) + //{{AFX_MSG_MAP(CAboutDlg) + // No message handlers + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMeterDlg dialog + +CMeterDlg::CMeterDlg(CWnd* pParent /*=NULL*/) + : CDialog(CMeterDlg::IDD, pParent) + , m_busnumber(_T("")) +{ + //{{AFX_DATA_INIT(CMeterDlg) + //}}AFX_DATA_INIT + // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +void CMeterDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CMeterDlg) + DDX_Control(pDX, IDC_PROGRESS, m_ctrlProgress); + DDX_Control(pDX, IDC_PEEK, m_ctrlPeekValue); + DDX_Text(pDX, IDC_BUS, m_busnumber); + //}}AFX_DATA_MAP + + +} + +BEGIN_MESSAGE_MAP(CMeterDlg, CDialog) + //{{AFX_MSG_MAP(CMeterDlg) + ON_WM_DESTROY() + ON_WM_SYSCOMMAND() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMeterDlg message handlers + +BOOL CMeterDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + CString strAboutMenu; + strAboutMenu.LoadString(IDS_ABOUTBOX); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + m_ctrlProgress.SetRange( 0 , 255 ); + m_ctrlPeekValue.SetRange( 0 , 255 ); + + nb_buffers = 0; + peekValue = 0.0; + lastValue = 0.0; + m_seuil = 15.0; + + openWaveDev(); + + // parse command Line Info + ParseCmdLine cmd; + AfxGetApp()->ParseCommandLine( cmd ); + + // Set Argument from Command Line + m_busnumber = cmd.m_busNumber; + bus = new Ivy( "IvyAudioMon","IvyAudioMon Ready",this,FALSE); + +// bus->BindMsg("(.*)", BUS_CALLBACK_OF(CTestDlg, IvyCallback )); + + //bus->BindMsg("^S( A=([0-9]+))?( B=([0-9]+))?",cb); + + // force bus start in case of start + m_busnumber = bus->GetDomain( CONVSTR(m_busnumber) ); + bus->start(CONVSTR(m_busnumber)); + + + VERIFY(this->UpdateData(FALSE)); + + return TRUE; // return TRUE unless you set the focus to a control +} +void CMeterDlg::OnApplicationConnected(IvyApplication *app) +{ +// TRACE( "Application: %s ready",(LPCSTR)(app->GetName()) ); +} +void CMeterDlg::OnApplicationDisconnected(IvyApplication *app) +{ +// TRACE( "Application: %s bye",(LPCSTR)(app->GetName()) ); +} +void CMeterDlg::OnOK() +{ + VERIFY(this->UpdateData(TRUE)); + m_busnumber = bus->GetDomain( CONVSTR(m_busnumber) ); + if ( m_busnumber.FindOneOf(":") ) + { + bus->stop(); + bus->start(CONVSTR(m_busnumber)); + } + VERIFY(this->UpdateData(FALSE)); + + // Do not close on return key + return; + + // CDialog::OnOK(); // This will close the dialog and DoModal will return. +} + + +void CMeterDlg::OnDestroy() +{ + bus->stop(); + delete bus; + CDialog::OnDestroy(); +} + +void CMeterDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialog::OnSysCommand(nID, lParam); + } +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CMeterDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialog::OnPaint(); + } +} + +// The system calls this to obtain the cursor to display while the user drags +// the minimized window. +HCURSOR CMeterDlg::OnQueryDragIcon() +{ + return (HCURSOR) m_hIcon; +} + + +/* +* Callback function when WAVE input buffer is full +*/ +void CALLBACK CMeterDlg::recordCallBack(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + CMeterDlg* ctrl = (CMeterDlg*) dwInstance; + ctrl->recordCB( hWaveIn, uMsg, dwInstance, dwParam1, dwParam2 ); +} +void CALLBACK CMeterDlg::recordCB(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + float lVal =0; + switch ( uMsg ) + { + case WIM_OPEN: + //TRACE("WIM_OPEN\n"); + break; + case WIM_DATA: + for ( DWORD i = 0; i < WaveHeader.dwBytesRecorded; i++ ) + lVal += ( signed char )WaveHeader.lpData[i]; + lVal /= WaveHeader.dwBytesRecorded ; + lVal += 127; + //TRACE("WIM_DATA %d %d %f\n",WaveHeader.dwBufferLength,WaveHeader.dwBytesRecorded,lVal); + nb_buffers++; + peekValue = max( peekValue, lVal ); + // moyenne sur 1 seconde + if ( nb_buffers*BUFSIZE > 8000 ) + { + nb_buffers = 0; + peekValue = lVal; + } + m_ctrlPeekValue.SetPos( peekValue ); + m_ctrlProgress.SetPos(lVal); + if ( lVal > m_seuil || lastValue > m_seuil ) + { + lastValue = lVal; + if ( lVal < m_seuil ) peekValue = lVal = 0.0; + bus->SendMsg("AudioMonitor Change value=%.2f peak=%.2f",lVal,peekValue); + } + if (waveInUnprepareHeader(hWaveIn, &WaveHeader,sizeof(WAVEHDR))) + { + //cerr << "WAVE unprepare input buffer error\n"; + //exit(1); + } + WaveHeader.dwFlags = 0; + + if (waveInPrepareHeader(hWaveIn, &WaveHeader,sizeof(WAVEHDR))) + { + } + if (waveInAddBuffer(hWaveIn, &WaveHeader,sizeof(WAVEHDR))) + { + } + break; + case WIM_CLOSE: + //TRACE("WIM_OPEN\n"); + break; + } +} +void CMeterDlg::openWaveDev() +{ + MMRESULT Rc; + WAVEFORMATEX PCMWaveFmtRecord; + + PCMWaveFmtRecord.wFormatTag = WAVE_FORMAT_PCM; + PCMWaveFmtRecord.nChannels = 1; + PCMWaveFmtRecord.nSamplesPerSec = 8000; + PCMWaveFmtRecord.wBitsPerSample = 8; + PCMWaveFmtRecord.nAvgBytesPerSec = PCMWaveFmtRecord.nSamplesPerSec + * PCMWaveFmtRecord.wBitsPerSample / 8; + PCMWaveFmtRecord.nBlockAlign = PCMWaveFmtRecord.nChannels * + PCMWaveFmtRecord.wBitsPerSample / 8; + + Rc = waveInOpen(&hWaveIn, WAVE_MAPPER, &PCMWaveFmtRecord, (DWORD_PTR)CMeterDlg::recordCallBack, (DWORD_PTR)this, CALLBACK_FUNCTION); + if (Rc) + { + } + WaveHeader.dwBufferLength = BUFSIZE; + WaveHeader.lpData = (LPSTR) (inbuf); + WaveHeader.dwFlags = WaveHeader.reserved = 0; + WaveHeader.dwLoops = 0; + WaveHeader.lpNext = 0; + Rc = waveInPrepareHeader(hWaveIn, &WaveHeader, + sizeof(WAVEHDR)); + if (Rc) + { + waveInClose(hWaveIn); + } + Rc = waveInAddBuffer(hWaveIn, &WaveHeader, + sizeof(WAVEHDR)); + if (Rc) + { + waveInClose(hWaveIn); + } + + + ResetEvent(recordDone); + + if (Rc = waveInStart(hWaveIn)) + { + waveInClose(hWaveIn); + } +} + -- cgit v1.1