|
|
How to debug through the code in an activeX control.
aasstt
|
|
|
|
|
Depends on the program using the control.
1- You can develop a test application, which uses the Control and set it as the "Executable for debug session"
2- You can use the ActiveX Control Test Container as the "Executable for debug session" in Visual Studio Project Settings.
3- If you are developing the control for use in Internet Explorer, then set iexplore.exe as the executable for debug session.
Place breakpoints in your code, then F5 (Go) it.
this is this.
|
|
|
|
|
First, I am new to C++. I have some C background with DOS and Unix but that was 15 years ago. My most recent work was vb.net. I am now doing some audio based coding in VC++ and I am having some problems, probably from my lack of knowledge. Unfortunately, I have until Monday to get this code working...
I have three classes and three separate files. The developer that started this is simply calling the classes without reinstantiating them.
I am reading a wave file in and that works fine. But, I need to create a global buffer for the wave data so that the other two classes can access it or find someway to pass the buffer by references to the other classes' functions.
Can anyone give me some same code on doing this? Thank you.
Bill Dennis
Orlando, FL
|
|
|
|
|
Create a class for the global data buffer.
Put it in a separate header file.
class CGlobalData<br />
{<br />
static [DATA_TYPE_HERE] m_Data;<br />
};
Then use it as:
CGlobalData::m_Data;
this is this.
|
|
|
|
|
I did as you suggested and am etting the following error:
c:\development\c-tools\Classes\WavWrite.cpp(79): error C2248: 'CReadDemoWave::testinteger' : cannot access private member declared in class 'CReadDemoWave'
I need to be able to access this data from three separate .cpp files.
Here's my 'h:
\
class CReadDemoWave
{ static int testinteger;
public:
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);
WAVEHDR lpDemoData;
DWORD dwDemoDataSize;
int m_nDemoBufferSize;
BYTE* m_pbyDemoBuffer;
HMMIO m_hmmio;
};
I am including the .h in all three .cpp files. Am I doing something wrong?
Bill Dennis
Orlando, FL
|
|
|
|
|
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
|
|
|
|
|