|
Sorry about that.
You need to make the variable public. By default it is private.
Just write public: before the variable declaration in the class. Like:
class CSomething<br />
{<br />
public:
static DATA_TYPE m_Data;<br />
<br />
};
this is this.
|
|
|
|
|
I'm sorry but now I get the following message:
Single error LNK2001: unresolved external symbol "public: static int CReadDemoWave::testinteger" (?testinteger@CReadDemoWave@@2HA)
Here is my .h:
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#define ERROR_LENGTH 1024
class CReadDemoWave
{
public:
static int testinteger;
void ReadDemoWave();
void ReadDemoIntoBuffer();
void PlayWav();
long QueueWaveData(HWAVEOUT HWaveOut, WAVEHDR * waveHeader,
DWORD WaveDataPlayed, DWORD WaveBufSize, HMMIO HMmio);
LPSTR *GetDemoBuffer(void);
void WriteDemo(HMMIO recordHandle);
// =========== D == E == M == O =======================
// BD create demo buffer.
WAVEHDR lpDemoData;
DWORD dwDemoDataSize;
int m_nDemoBufferSize;
BYTE* m_pbyDemoBuffer;
HMMIO m_hmmio;
//HMMIO hmmio;
char m_szError[ERROR_LENGTH];
int m_nError;
MMIOINFO m_mmioInfo;
DWORD dwDataSize;
DWORD dwCount;
HPSTR m_hptr;
int m_nBufferSize;
};
Bill Dennis
Orlando, FL
|
|
|
|
|
Hi,
the problem here is that the definition is missing.
Guess your header file (ReadDemoWave.h) looks like this:
class CReadDemoWave
{
public:
private:
static int m_anyInt;
};
Then you have to add the definition of m_anyInt to your cpp file:
#include "ReadDemoWave.h"
int CReadDemoWave::m_anyInt;
CReadDemoWave::CReadDemoWave()
{
}
Regards
Achim Klein
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
Hi,
in my opinion it is always worth an attempt to get around global data.
Maybe this design pattern (Visitor) can help you.
The class that can read wave files:
class IveGotTheData
{
public:
bool ReadWaveFile(const char* Path);
void UseMyData(IknowTheAlgorithm& Operator)
{
Operator.Operate(this);
}
};
The base class for all algorithms that modify your wave data (the Visitor):
class IknowTheAlgorithm
{
public:
virtual void Operate(IveGotTheData* Data) = 0;
};
Your first algorithm is encapsulated in this class:
class Algorithm1 : public IknowTheAlgorithm
{
public:
virtual void Operate(IveGotTheData* Data)
{
}
};
Your second algorithm is encapsulated in this class:
class Algorithm2 : public IknowTheAlgorithm
{
public:
virtual void Operate(IveGotTheData* Data)
{
}
};
Using your algorithms looks like this:
void main()
{
IveGotTheData wav;
if (wav.ReadWaveFile("Test.wav"))
{
Algorithm1 alg1;
Algorithm2 alg2;
wav.UseMyData(alg1);
wav.UseMyData(alg2);
}
}
Regards
Achim Klein
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
This would be good if it were a new system or code already written in this fashion but I am modifying someone else's code, so I can';t totally rewrite the program. But, thanks.
Bill Dennis
Orlando, FL
|
|
|
|
|
Hi,
could you post the three header files, please ?
Maybe <pre> code </pre> is useful.
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
// WavWrite.h: interface for the CWavWrite class.
#if !defined(AFX_WAVWRITE_H__2C400A28_DDC3_11D0_9FD3_444553540001__INCLUDED_)
#define AFX_WAVWRITE_H__2C400A28_DDC3_11D0_9FD3_444553540001__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
//#include "readdemowave.h"
#define ERROR_LENGTH 1024
//CReadDemoWave cReadDemo;
//static DWORD dwDemoDataSize;
//WAVEHDR lpDemoData;
//static WAVEHDR lpDemoData;
/* Definition from MS
typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
typedef struct {
FOURCC ckid;
DWORD cksize;
FOURCC fccType;
DWORD dwDataOffset;
DWORD dwFlags;
} MMCKINFO;
*/
class CWavWrite
{
private:
char m_szName[FILENAME_MAX];
HMMIO m_hmmioFile;
HMMIO m_hmmioDemoFile;
MMCKINFO m_ckRIFF, m_ckfmt, m_ckdata;
int m_nDataLeft;
WAVEFORMATEX *m_pwfx;
PCMWAVEFORMAT m_pcmWaveFormat;
int m_cbExtraAlloc;
MMIOINFO m_mmioInfo;
// BD 9/13/05
/*int DEMO;
int rndcnt;
int bufcnt;*/
// Created here so not created each time Read or Write Data is called
// Otherwise these could be local variables - trade speed for size
int m_nCopyLength, m_nActualWrite;
int m_i;
// Error variables
int m_nError;
char m_szError[ERROR_LENGTH];
public:
//WAVEHDR lpDemoData;
//DWORD dwDemoDataSize;
// Constructor (empty) / Destructor
CWavWrite();
virtual ~CWavWrite();
// Data processing - too large to be effective as an inline functions
// BD added lat param for demo buffer
//int Write(BYTE *pBuffer, int nDataSize, WAVEHDR *pDemoBuffer);
int Write(BYTE *pBuffer, int nDataSize);
void WriteDemo(BYTE *pBuffer, int nDataSize);
// File Manipulation
void Open(void);
void Init(MMCKINFO *pckRIFF, MMCKINFO *pckfmt, MMCKINFO *pckdata,
WAVEFORMATEX *pwfx, int nBufferSize);
void Init(short wBitsPerSample, int nSampleFrequency, short wChannels, int nBufferSize);
void Close(void);
// Parameter Manipulation
void SetName(char *);
char *GetName(void);
// Parameters below may be different than input file, CWavRead.
long GetNumberOfSamples(void);
long GetSampleFrequency(void);
short GetBitsPerSample(void);
short GetNumberOfChannels(void);
MMCKINFO *GetckRIFF(void);
MMCKINFO *Getckfmt(void);
MMCKINFO *Getckdata(void);
WAVEFORMATEX *GetWaveFormatEx(void);
WAVEFORMATEX *DEMOfmt;
// Error Handling
int IsError(void) { return m_nError; };
char *GetError(void) { return m_szError; };
// Demo file
int DEMOWrite(void);
int GetStruct(HMMIO);
int ConvertWav(HMMIO);
};
#endif // !defined(AFX_WAVWRITE_H__2C400A28_DDC3_11D0_9FD3_444553540001__INCLUDED_)
////////////////////////////////////////////////////////////////////////////////
// SingleDlg.h : header file
#if !defined(AFX_SINGLEDLG_H__B2588407_6984_11D1_A856_444553540000__INCLUDED_)
#define AFX_SINGLEDLG_H__B2588407_6984_11D1_A856_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "AboutDlg.h"
#include "SingleAlg.h"
#include "StaticButton.h"
#include "ToolTipCtrlAdv.h"
#include "WavWrite.h"
#include "WavRecord.h"
#include "Presets.h"
#include "SettingsDlg.h"
#include "LedMeter.h"
#include "LedDriver.h"
#include "WavRead.h"
//#include "PaletteFromDIB.h"
// #include "Convert.h" //CONVERT
#include "ReadDemoWave.h"
// Shareware stuff
#include "SharewareDlg.h"
#define REG_FILE_NAME "aisin.rg"
#define REG_DAYS 45
#define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0]))
// Audio stuff
//#define LARGEST_BUFFER_SIZE 65536; //352800 // 2 sec at 44.1k 16 bit stereo
//#define NUMBER_OF_BUFFERS 4 // Not needed when using end of gap
#define WM_USER_THREAD_RECORD_FINISHED (WM_APP + 1)
#define WM_USER_NONSTATIC_THREAD_RECORD_UI (WM_APP + 2)
/////////////////////////////////////////////////////////////////////////////
// CSingleDlg dialog
struct THREADPARMS_RECORD
{
CWnd *pWnd;
CSingleAlg *pckSingleAlg;
CWavWrite *pWavWrite;
CWavRecord *pWavRecord;
CReadDemoWave *pReadDemo;
BYTE *pbyBuffer;
int *pnBufferSize;
// put demo buffer here and load it prior to record?
// BD &&& demo buffer
//WAVEHDR lpDemoData;
//DWORD dwDemoDataSize;
BYTE *pDemoBuffer;
int *pnDemoBufferSize;
CString *pstrCurFile;
CString *pstrCurFilePath;
CEvent *pEvent;
CCriticalSection *pCriticalSection;
int *pnStop;
};
class CSingleDlg : public CDialog
{
protected:
// Program variables
CSingleAlg m_ckSingleAlg;
CWavWrite m_cWavWrite;
CWavRecord m_cWavRecord;
CEvent m_cEventRecord;
CCriticalSection m_cCriticalSection;
HANDLE m_hThreadRecord;
THREADPARMS_RECORD m_threadParmsRecord;
int m_nIsRecording, m_nStopRecord;
int m_nBufferSize;
BYTE* m_pbyBuffer;
CReadDemoWave ReadDemo;
//// =========== D == E == M == O =======================
// // BD create demo buffer.
// int m_nDemoBufferSize;
// BYTE* m_pbyDemoBuffer;
// HMMIO m_hmmioDemoFile;
//void ReadDemoIntoBuffer();
/* void ReadWavFile();
DWORD PlayWaveFile(LPSTR path);
*/ long QueueWaveData(HWAVEOUT HWaveOut, WAVEHDR * waveHeader, DWORD WaveDataPlayed, DWORD WaveBufSize, HMMIO HMmio);
//void CALLBACK WaveOutProc(HWAVEOUT waveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
void PlayWav();
//char m_szError[ERROR_LENGTH];
//int m_nError;
//HMMIO m_hmmio;
//MMIOINFO m_mmioInfo;
//DWORD dwDataSize;
//DWORD dwCount;
//HPSTR m_hptr;
//HPSTR lpData;
// Demo buffer
// WAVEHDR lpDemoData;
// DWORD dwDemoDataSize;
//WAVEHDR GetDemoBuffer(void);
//int samplecnt;
// =========== D == E == M == O =======================
long m_lTotalTimeSize, m_lSongTimeSize;
int m_nTotalTimeMin, m_nTotalTimeSec;
int m_nSongTimeMin, m_nSongTimeSec;
int m_nIsLargeFont, m_nNumColors;
int m_nButtonBackground;
UINT m_nWindowSize;
// Algorithm variabls
int m_nSliderGapSize;
int m_nSliderGapLevel;
int m_nSliderMinSongSize;
int m_nSliderEndSize;
int m_nButtonDCBlock;
int m_nCheckIgnore;
int m_nSamplesPerSec;
short m_wBitsPerSample;
short m_nChannels; // Not used in this version, but ready in Presets
int m_nWaveInID;
// Presets
CObArray m_ObArrayPresets;
char m_szCurPresetName[FILENAME_MAX];
char m_szTempPresetFileName[FILENAME_MAX], m_szPresetFileName[FILENAME_MAX];
void LoadPresets(void);
void RestorePresets(void);
void SavePresets(void);
// File Counter
CString m_strCurFile, m_strCurFilePath, m_strCurFileText;
int m_nSongTime, m_nTotalTime, m_nClipped;
CString m_strTotalTime, m_strSongTime, m_strClipped;
// Meters
CLedMeter m_cLedMeterL, m_cLedMeterR;
CFont m_cFontMeter;
LedDriver m_ledDriver;
int m_nIsDisplayedL, m_nIsDisplayedR;
int m_nPeakLevelL, m_nPeakLevelR;
int m_nAveLevelL, m_nAveLevelR;
int m_nClipL, m_nClipR;
// System resources
HICON m_hIconRecord;
HICON m_hIconStop;
HICON m_hIconSndVol;
HBITMAP m_hBitmapAlbum0, m_hBitmapAlbum1;
COLORREF m_colorDialog, m_colorText;
CBrush m_cBrushDialog;
CBrush m_cBrushCombo;
CFont m_cFontCombo;
CPalette m_cPalette; // *m_pcOldPalette;
CToolTipCtrlAdv m_ctlTTAdv;
// RegLevel
int m_nRegLevel;
// Construction
public:
//WAVEHDR lpDemoData;
//DWORD dwDemoDataSize;
CSingleDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSingleDlg)
enum { IDD = IDD_SINGLE_DIALOG };
CStatic m_ctlStaticClipped;
CButton m_ctlButtonSndVol;
CStatic m_ctlStaticAlbum;
CButton m_ctlButtonBackground;
CStatic m_ctlStaticTotalTime;
CStatic m_ctlStaticSongTime;
CStatic m_ctlStaticCurrentFile;
CComboBox m_ctlComboPresetName;
CButton m_ctlButtonSettings;
CButton m_ctlButtonOK;
CComboBox m_ctlComboOutfileName;
CButton m_ctlButtonRecordStop;
CButton m_ctlButtonRecord;
CButton m_ctlButtonOutfileBrowse;
//}}AFX_DATA
CStaticButton m_ctlStaticButtonAiplSound;
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSingleDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CSingleDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonOutfileBrowse();
afx_msg void OnSelchangeComboOutfileName();
afx_msg void OnButtonRecord();
afx_msg void OnButtonRecordStop();
virtual void OnOK();
afx_msg void OnClose();
afx_msg void OnDestroy();
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg void OnButtonSettings();
afx_msg void OnSelchangeComboPresetName();
afx_msg void OnCheckBackground();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnButtonSndVol();
//}}AFX_MSG
afx_msg LRESULT OnThreadRecordFinished(WPARAM, LPARAM);
afx_msg void OnStaticButtonAiplSound();
// Palette stuff
afx_msg void OnPaletteChanged(CWnd* pFocusWnd);
afx_msg BOOL OnQueryNewPalette();
afx_msg void OnSysColorChange(void); // Don't need - when number of colors change
DECLARE_MESSAGE_MAP()
// Meters
static void __stdcall GetMeterData(int iMeter, int& iAverageLevel, int& iPeakLevel, BOOL& bClip);
// Other functions
static UINT ThreadRecord(LPVOID);
static void CALLBACK CallbackRecord(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1,
DWORD dwParam2);
LRESULT OnNonstaticThreadRecordUI(WPARAM wParam, LPARAM lParam);
// Init Stuff
void InitDialogSound(void);
// Settings
void SaveSettings(void);
void RestoreSettings(void);
void RestoreOutfile(CString);
public:
afx_msg void OnBnClickedOk();
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SINGLEDLG_H__B2588407_6984_11D1_A856_444553540000__INCLUDED_)
//////////////////////////////////////////////////////////////////////
// WavRecord.h: interface for the CWavRecord class.
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_WAVRECORD_H__2C400A28_DDC3_11D0_9FD3_444553540021__INCLUDED_)
#define AFX_WAVRECORD_H__2C400A28_DDC3_11D0_9FD3_444553540021__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#define ERROR_LENGTH 1024
/* Definition from MS
typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
typedef struct {
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag * lpNext;
DWORD reserved;
} WAVEHDR;
*/
class CWavRecord
{
private:
UINT m_uDeviceID;
HGLOBAL m_pbyData[2];
int m_nCurData;
DWORD m_dwDataSize;
HWAVEIN m_hWaveIn;
WAVEHDR m_WaveHdr[2];
DWORD m_dwBytesRecorded;
// Error variables
int m_nError;
char m_szError[ERROR_LENGTH];
public:
// Constructor (empty) / Destructor
CWavRecord();
virtual ~CWavRecord();
// Data processing
void Start(void);
int Queue(BYTE *pbyData);
int Stop(BYTE *pbyData);
// Data Manipulation
void Open(WAVEFORMATEX *pfwx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen);
void Query(WAVEFORMATEX *pfwx);
void Init(DWORD dwDataSize);
void Close(void);
// Inline - for speed
int IsDone(void);
// Parameter Manipulation
void SetDeviceID(UINT);
UINT GetDeviceID(void);
// Error Handling
int IsError(void) { return m_nError; };
char *GetError(void) { return m_szError; };
};
//////////////////////////////////////////////////////////////////////
// Data Processing - inline for speed
//////////////////////////////////////////////////////////////////////
inline int CWavRecord::IsDone(void)
{
if ( m_WaveHdr[m_nCurData].dwFlags & WHDR_DONE )
return 1;
else
return 0;
}
#endif // !defined(AFX_WAVRECORD_H__2C400A28_DDC3_11D0_9FD3_444553540021__INCLUDED_)
Bill Dennis
Orlando, FL
|
|
|
|
|
Many lines. I need a moment...
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
I guess you have a class named CWavRead .
I guess you want to pass the buffer that this class fills to other functions.
I guess all of this takes place somewhere inside your CSingleDlg class.
Please correct me, if I'm wrong.
In this case my header file would approximately look like this:
class CWavRead;
class CSingleDlg
{
public:
...
private:
CWavRead* m_wavReader;
};
And my implementation file would approximately look like this:
#include "SingleDlg.h"
#include "WavRead.h"
CSingleDlg::CSingleDlg()
{
m_wavReader = new CWavRead;
}
CSingleDlg::~CSingleDlg()
{
delete m_wavReader;
}
CSingleDlg::OnFileOpen()
{
m_wavReader->read(path);
}
CSingleDlg::OnEditModify()
{
long size = m_wavReader->getBufferSize();
BYTE* buffer = m_wavReader->getBuffer();
CWavOperator operator;
operator.DoSomething(buffer, size);
}
Is it useful ?
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
Unfortunately I don't know the interface of your CWavRead class...
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
Thanks. Can you give me an idea of the implementation code for the getBuffer function to make sure I'm doing it right. I wrote one but it kepts resetting.
Here's my read .h
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#define ERROR_LENGTH 1024
class CReadDemoWave
{
public:
BYTE m_pbyDemoBuffer;
static int testinteger;
void ReadDemoWave();
BYTE *ReadDemoIntoBuffer();
void PlayWav();
long QueueWaveData(HWAVEOUT HWaveOut, WAVEHDR * waveHeader,
DWORD WaveDataPlayed, DWORD WaveBufSize, HMMIO HMmio);
BYTE *GetDemoBuffer(void);
//void WriteDemo(HMMIO recordHandle);
//public:
// =========== D == E == M == O =======================
// BD create demo buffer.
WAVEHDR lpDemoData;
DWORD dwDemoDataSize;
int m_nDemoBufferSize;
//BYTE* m_pbyDemoBuffer;
HMMIO m_hmmio;
//HMMIO hmmio;
char m_szError[ERROR_LENGTH];
int m_nError;
MMIOINFO m_mmioInfo;
DWORD dwDataSize;
DWORD dwCount;
HPSTR m_hptr;
int m_nBufferSize;
//WAVEFORMATEX waveFormat;
};
Bill Dennis
Orlando, FL
|
|
|
|
|
If your read function fills m_pbyDemoBuffer , just write
BYTE* CReadDemoWave::getBuffer() const
{
return m_pbyDemoBuffer;
}
Returning a reference (pointer) breaks the privacy concept of your class, but it's handy.
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
I have it like this:
BYTE *CReadDemoWave::GetDemoBuffer(void)
{
return &m_pbyDemoBuffer;
}
When I take out the refrence (&), I get a compiler error saying it can't convert from BYTE to BYTE*.
It's been 15 years since I've worked with pointers so not sure I am doing this correctly.
My pointer seems to be resetting itself from the time the buffer is created and the time I call GetDemoBuffer().
Bill Dennis
Orlando, FL
|
|
|
|
|
BYTE m_pbyDemoBuffer is no array. It's just one number.
If you want to create an array, please use new and delete :
int size = 1000;
BYTE* array = new BYTE[size];
delete[] array;
It's like malloc and free .
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
In another post, I asked someone to show me how to allocate member for m_pbyDemoBuffer. I am rewading the wave data into a LPSTR variable, then creating and allocating memory for m_pbyDemoBuffer using GlobalAlloc and doing memcpy from lpDemoData.lpData to m_pbyDemoBuffer. I am then returning *m_pbyDemoBuffer in GetDemoBuffer().
So, not using arrays here.
Bill Dennis
Orlando, FL
|
|
|
|
|
I am reading the wave data into a LPSTR variable, [...]
How do you allocate the memory at the position your LPSTR variable points to ?
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
I've pasted part of the code below. I have a lot of junk commented out in the actual .cpp file but if you want that, I can send it without violating my contract. Thanks.
''Allocate space for data in lpDemoData structure.
// lpData is LPSTR.
if (!( lpDemoData.lpData = (char *)VirtualAlloc(0, dwDemoDataSize<<1, MEM_COMMIT, PAGE_READWRITE)))
{
printf("ERROR: Can't allocate memory for WAVE buffer!\n");
}
// Read Data Chunk into lpData
if (readres = mmioRead(hmmio, (HPSTR )lpDemoData.lpData, dwDemoDataSize) != dwDemoDataSize)
{
AfxMessageBox("Error: Failed to read data chunk.");
mmioClose(hmmio,0);
return;
}
//Create byte-based buffer, allocate memory and copy
// lpData to it.
int lenlpData=strlen(lpDemoData.lpData);
m_pbyDemoBuffer=(BYTE)GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, lenlpData );
memcpy((BYTE*)m_pbyDemoBuffer, lpDemoData.lpData, lenlpData);
Bill Dennis
Orlando, FL
|
|
|
|
|
Yeah, if your project isn't yet working, I'll have a look at it.
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
.h:
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#define ERROR_LENGTH 1024
class CReadDemoWave
{
public:
BYTE m_pbyDemoBuffer;
static int testinteger;
void ReadDemoWave();
BYTE *ReadDemoIntoBuffer();
void PlayWav();
long QueueWaveData(HWAVEOUT HWaveOut, WAVEHDR * waveHeader,
DWORD WaveDataPlayed, DWORD WaveBufSize, HMMIO HMmio);
BYTE *GetDemoBuffer(void);
//void WriteDemo(HMMIO recordHandle);
//public:
// =========== D == E == M == O =======================
// BD create demo buffer.
WAVEHDR lpDemoData;
DWORD dwDemoDataSize;
int m_nDemoBufferSize;
//BYTE* m_pbyDemoBuffer;
HMMIO m_hmmio;
//HMMIO hmmio;
char m_szError[ERROR_LENGTH];
int m_nError;
MMIOINFO m_mmioInfo;
DWORD dwDataSize;
DWORD dwCount;
HPSTR m_hptr;
int m_nBufferSize;
//WAVEFORMATEX waveFormat;
};
.cpp:
// ================DEMO========================
BYTE *ReadDemoWave::ReadDemoIntoBuffer()
{
// HPSTR demobuffer;
// Open file
if( (m_hmmio=mmioOpen("AIPL.WAV", NULL,MMIO_ALLOCBUF | MMIO_READ )) == NULL )
{
AfxMessageBox("A critical file is missing from your system. Contact AIPL. Singulator will now stop.");
m_nError = 1;
exit(NULL);
}
// GET INFO ON FILE I/O BUFFER
if (mmioGetInfo(m_hmmio, &m_mmioDemoInfo, 0))
{
sprintf(m_szError, "Failed to get I/O buffer info/n");
AfxMessageBox("Failed to get I/O buffer info");
m_nError = 1;
mmioClose(m_hmmio,0);
return (NULL);
}
// check if needs advance
if (m_mmioDemoInfo.pchNext == m_mmioDemoInfo.pchEndRead){
if (mmioAdvance(m_hmmio,&m_mmioDemoInfo, MMIO_READ)){
//ERROR HERE
mmioClose(m_hmmio, 0);
sprintf(m_szError, "Failed to Advance I/O buffer info/n");
AfxMessageBox("Failed to advance I/O buffer info");
m_nError = 1;
return (NULL);
}
}
HWND hwnd=NULL;
LPSTR path = "AIPL.WAV";
PlayWav();
WriteDemo(&m_pbyDemoBuffer,dwDemoDataSize);
mmioSetInfo(m_hmmio, &m_mmioDemoInfo, 0);
mmioClose(m_hmmio, 0);
return (&m_pbyDemoBuffer);
}
//================PLAYWAV=======================
void CReadDemoWave::PlayWav()
{
HMMIO hmmio;
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubchunk;
DWORD dwFmtSize;
DWORD WaveDataPlayed;
HWAVEOUT hwaveout=NULL;
WAVEFORMATEX waveFormat; /* for reading a fmt chunk's data */
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
if((hmmio=mmioOpen("aipl.WAV",NULL,MMIO_READ | MMIO_ALLOCBUF)) == NULL) {
AfxMessageBox("Error opening file");
return;
}
mmckinfoParent.fccType = mmioFOURCC('W','A','V','E');
if (mmioDescend(hmmio,(LPMMCKINFO) &mmckinfoParent,NULL,MMIO_FINDRIFF)) {
AfxMessageBox("Error GETTING Wave Chunk.");
mmioClose(hmmio,0);
return;
}
// Find the "FMT" chunk (form type "FMT"); it must be
// a subchunk of the "RIFF" chunk.
mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
AfxMessageBox("Waveform-audio file has no FMT chunk.");
mmioClose(hmmio, 0);
return;
}
// Get the size of the "FMT" chunk. Allocate
// and lock memory for it.
dwFmtSize = mmckinfoSubchunk.cksize;
// Read the "FMT" chunk.
/* Tell Windows to read in the "fmt " chunk into a WAVEFORMATEX structure */
if (mmioRead(hmmio, (HPSTR)&waveFormat, mmckinfoSubchunk.cksize) != (LRESULT)mmckinfoSubchunk.cksize)
{
//if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize){
AfxMessageBox("Failed to read format chunk.");
mmioClose(hmmio, 0);
return;
}
mmioAscend(hmmio,&mmckinfoSubchunk, 0);
mmckinfoSubchunk.ckid = mmioFOURCC('d','a','t', 'a');
if (mmioDescend(hmmio,&mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK))
{
AfxMessageBox("File has no data chunk.");
mmioClose(hmmio,0);
return;
}
dwDemoDataSize = mmckinfoSubchunk.cksize;
WaveDataPlayed = dwDemoDataSize;
if (dwDemoDataSize == 0L)
{
AfxMessageBox("Error: data chunk contains no data.");
mmioClose(hmmio,0);
return;
}
if (!( lpDemoData.lpData = (char *)VirtualAlloc(0, dwDemoDataSize<<1, MEM_COMMIT, PAGE_READWRITE)))
{
printf("ERROR: Can't allocate memory for WAVE buffer!\n");
}
int res = NULL;
// open output device here
if(((res=waveOutOpen(&hwaveout,WAVE_MAPPER, &waveFormat, 0, 0, CALLBACK_NULL))) != 0)
{
return;
}
// Read Entire Data Chunk into buffer.
int readres;
if (readres = mmioRead(hmmio, (HPSTR )lpDemoData.lpData, dwDemoDataSize) != dwDemoDataSize)
{
AfxMessageBox("Error: Failed to read data chunk.");
mmioClose(hmmio,0);
return;
}
int lenlpData=strlen(lpDemoData.lpData);
m_pbyDemoBuffer=(BYTE)GlobalAlloc(0, lenlpData );
memcpy((BYTE*)m_pbyDemoBuffer, lpDemoData.lpData, lenlpData);
int err;
//prepare header
lpDemoData.dwBufferLength = dwDemoDataSize;
lpDemoData.dwFlags = WHDR_BEGINLOOP;
if ((err = waveOutPrepareHeader(hwaveout, (WAVEHDR *)&lpDemoData, sizeof(WAVEHDR))))
{
err = MMSYSERR_NODRIVER;
exit(0);
}
// PLAY AUDIO HERE
/* Queue the WAVEHDR */
waveOutWrite(hwaveout, &lpDemoData, sizeof(WAVEHDR));
// CLOSE WAVE DEVICE.
//waveOutClose(hwaveout);
mmioClose(hmmio,0);
}
// ==================QUEUEWAVEDATA================================================
long CReadDemoWave::QueueWaveData(HWAVEOUT HWaveOut, WAVEHDR * waveHeader, DWORD WaveDataPlayed, DWORD WaveBufSize, HMMIO HMmio)
{
WAVEHDR * LastHdr;
/* More WAVE data to be queued? */
if (WaveDataPlayed)
{
/* Only a partial block left? */
if (WaveDataPlayed < WaveBufSize)
{
/* Tell Windows to read the remaining waveform data into our allocated memory */
if(mmioRead(HMmio, (HPSTR)waveHeader->lpData, WaveDataPlayed) != (long)WaveDataPlayed) goto bad;
/* Set the length field to remaining amount */
waveHeader->dwBufferLength = WaveDataPlayed;
/* Store last WAVEHDR */
LastHdr = waveHeader;
/* Indicate done */
WaveDataPlayed = 0;
goto good;
}
/* Tell Windows to read another full block of waveform data into our allocated memory */
if(mmioRead(HMmio, (HPSTR)waveHeader->lpData, WaveBufSize) != (long)WaveBufSize)
{
bad: /* Stop playback */
waveOutPause(HWaveOut);
/* Oops! */
printf("ERROR: reading WAVE data!\n");
return(-1);
}
/* Decrease # of bytes yet to play */
WaveDataPlayed -= WaveBufSize;
good: /* Clear the WHDR_DONE bit (which the driver set last time that
this WAVEHDR was sent via waveOutWrite and was played). Some
drivers need this to be cleared */
waveHeader->dwFlags &= ~WHDR_DONE;
/* Queue the WAVEHDR */
waveOutWrite(HWaveOut, waveHeader, sizeof(WAVEHDR));
// write to file.
/* Allow playback to continue */
return(0);
}
/* Did the last WAVEHDR get a chance to play? */
if (waveHeader == LastHdr)
{
/* Finished playing all WAVE data */
return(1);
}
/* Allow playback to continue */
return(0);
}
// ==============WRITEDEMO=================================
void CReadDemoWave::WriteDemo(BYTE *pBuffer, int nDataSize)
{
DWORD writes=0;
DWORD m_nDataSize=0;
// This is where my problem is.
if ((writes=mmioWrite(m_hmmioFile, (char *) m_pbyDemoBuffer,m_nDataSize) != nDataSize))
{
exit(0);
}
mmioClose(m_hmmioFile,0);
exit(0);
}
Bill Dennis
Orlando, FL
|
|
|
|
|
Hello
I want to record sound from Sound card to memory(buffer).
That sound is generated by people using microphone.
How can I decide it?
I am not have any Idea now.
If you have any suggestion, help me pls?
Thank you so much for you help.
Thank you
|
|
|
|
|
Hi, this is exactly what I am doing now. I am using the MCI commands, WaveInOpen(), mmioWrite(), etc.
There are some good articles here that helped me. But, I had to take a combination of the articles to actually get my project to work.
Check out MCI at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mci.asp
Bill Dennis
Orlando, FL
|
|
|
|
|
The 1st thing u hv to do is either create ur own wave class or get the function like what hv suggest by the guy who reply to u to do ur class. use msdn library to help you talking to ( do programming) the soundcard to buffer.u cn get msdn library online in vc++ developer centre or u jst buy the license or cd of it and can use offline.
you can take the wavein.cpp i jst posted in jst nw as a reference too. The file is about how to get the signal frm sound card to buffer.and at the same time, could u also help me to ask others how to read the buffer to display or do signal processing later? if yes, i would be very aprreciate ur help. thx a lot.gd luck..
|
|
|
|
|
Hi
I realy need help on how to change the text color of a single CListCtrl item at the list while the rest of the list needs to stay at the same color it has.
Thanks in advance
Assay
|
|
|
|
|
There are many, many good articles on doing that and more here at CodeProject. You can start with this one, and search if you need more.
|
|
|
|
|
Add a message handler as shown below and edit the code
u will get the below function , just type handler in
codeproject u get what u want
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST2, OnCustomdrawMyList)
void Reports1::OnCustomdrawMyList(NMHDR *pNMHDR, LRESULT *pResult)
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|