|
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
|
|
|
|
|
http://www.codeproject.com/listctrl/lvcustomdraw.asp
try this link
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
Hello,
I know php, actionscript/javascript and a basic perl. I trying now to learn visual c++ because I want to make applications. I have visual c++ but I'm not really sure what I'm doing, I have a few books from my brother (a programmer) and have tried to follow the exercises but I'm still lost.
When I write something in php or javascript I know what all of it does as I write the functions myself but with visual c++ I just drag things around and double click on them and give them names etc like the exercises say but I really have know idea where the code is or what particular file is being edited when I do try and change a value or property.
I had a look at some of the c++ files in my workspace directories and it all looks quite complicated with lots of comments saying add stuff here or 'class wizard will add properties here)'. Should I try and edit this so I understand it a bit better or will this just screw things up?
Before I started I thought it would be more like php where I write lots of functions and then just tell buttons what to do when they have been clicked but it's difficult to understand the code as it uses wierd names and ids (BTW: do ID names all have to be in UPPERCASE? I find that annoying.) for things, things I have know idea about because it was all created automatically.
Is there anyway of writing an application from scratch and doing all the code by hand so that I know what everything does? Or is this not the point of visual c++? Or maybe s.o. has links for beginners on writting applications with v. c++. Any advice would be great.
|
|
|
|
|