|
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.
|
|
|
|
|
Stephen Bungert wrote:
Should I try and edit this so I understand it a bit better or will this just screw things up?
writing C++ apps is all about editing the .CPP and .H files. all that stuff that Visual Studio does is nice, but it only handles a very small part of the whole thing.
Stephen Bungert wrote:
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
that's exactly what VC++ programming is all about. the dev environment will write stub functions for event-captures for you (button presses, paint events, etc). then you go and fill them in.
Stephen Bungert wrote:
BTW: do ID names all have to be in UPPERCASE?
no, but it's the standard. C/C++ macros (ie. #defines) are usually in all upper case.
Stephen Bungert wrote:
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++?
you can write console apps (DOS window apps) with no UI from scratch with VC++ . but if you want to do anything with Windows it's best to let VC generate the skeleton app for you.
my advice: start with a "dialog app". that's an application that starts as a single dialog. it will save you from the horrors of the Doc/View paradigm. the default dialog has OK and Cancel buttons - have VC create event handlers for those two functions, then put some of your own code in there to see what they do (hint: AfxMessageBox(...); can be handy). then add some other controls and play around with them. edit controls are pretty simple. list and combo boxes are a bit more complex, etc..
Cleek | Image Toolkits | Thumbnail maker
|
|
|
|
|
well, I remember my first days trying to figure Vc++ out... I think part of the problem is you're coming from the php, javascript/actionscript world which is the "interpreted" language world into the C++ world, which is "compiled" code. The whole point of php and other scripting languages is to make it easy for people to generate snippets of code that accomplish certain tasks, limitted in capabilities and performance.
I found that starting out by trying to understand the win32 programming basics helps a lot when dealing with VC++. The thing is all MFC does is it makes Win32 programming a lot easier, but that is only true for those who either know their way around Win32 standard programming, or those who don't care to understand the underlying paradigms of win32 programming. You seem to be one of those who likes to understand the underlying principles before building on top of them, so I'd suggest starting with a Win32 Application project... the "Hello World" example, and don't include any MFC support in the beginning. Try to understand the concept of Window as base class for almost all other classes in the Win32 environment. Once you grasp the Window concept, how to create one, what is the message pump, what are messages, how to handle them.. then you can move on and start getting into the more advanced stuff.
Good luck!
|
|
|
|
|
i'm also a beginner of vc++ 6. i even blur of c++ indeed. i jst hv sth share wth u, duno whether can help u or nt, bt maybe can cheer u up..hehe..c++ fundamental is very important b4 u start to learn vc++ 6. the vc++ 6 bible and teach urself vc++ 6 in 21 days and the beginning of vc++ are quite a good book. some ebook like teach urself c++ in 21 days is also very useful for me to understand some basic of c++ fast.
every language is different. it takes time to learn. be patient. i believe in patient learning make ur life wonderful . i still hv one mths to pass up my vc++ project, i hope i can fulfill it with the some help of engineer as i wish. gambadei( keep up gd work)...gd luck.
|
|
|
|
|
Hi,
understanding the 'Visual' part of Visual C++ (MFC) becomes much more easier, if you learn the basics of object orientation first.
So don't start with a GUI application but create your own small console-based projects first, add some classes and let them interact.
1. Start a new console-based project
2. Add a source-code file to that project
3. Define your main() function
MyFirstProject.cpp looks like this:
#include <iostream>
using namespace std;
void main()
{
cout << "Hello World" << endl;
}
4. Create your first object (an object of the string class)
MyFirstProject.cpp looks like this:
#include <iostream>
#include <string>
using namespace std;
void main()
{
string text;
text = "Hello World";
cout << text << endl;
}
5. Extract your first function
MyFirstProject.cpp looks like this:
#include <iostream>
#include <string>
using namespace std;
void showMe(const string& Text)
{
cout << Text << endl;
}
void main()
{
showMe("Hello World");
}
6. Create your first class
MyFirstProject.cpp looks like this:
#include <iostream>
#include <string>
using namespace std;
class MyFirstClass
{
public:
MyFirstClass(const string& Text);
void showMe();
private:
string m_text;
};
MyFirstClass::MyFirstClass(const string& Text)
{
m_text = Text;
}
void MyFirstClass::showMe()
{
cout << m_text << endl;
}
void main()
{
MyFirstClass MySecondObject("Hello World");
MySecondObject.showMe();
}
7. Spread your code to different files
- Add a header file to your project
- Add another source-code file to your project
MyFirstProject.cpp looks like this:
#include "MyFirstClass.h"
void main()
{
MyFirstClass MyThirdObject("Hello World");
MyThirdObject.showMe();
}
MyFirstClass.h looks like this:
#include <string>
using namespace std;
class MyFirstClass
{
public:
MyFirstClass(const string& Text);
void showMe();
private:
string m_text;
};
MyFirstClass.cpp looks like this:
#include "MyFirstClass.h"
#include <iostream>
MyFirstClass::MyFirstClass(const string& Text)
{
m_text = Text;
}
void MyFirstClass::showMe()
{
cout << m_text << endl;
}
8. Add more classes and let them interact...
This is C++. The rest is Microsoft (MFC) specific.
I hope you got an idea of how to develop C++ programs from scratch.
Regards
Achim Klein
We can do no great things, only small things with great love. - Mother Theresa
|
|
|
|
|
hi all,
how can i get information (in run time) about the machine which run the code,
i.e how can i know the processor model and the RAM and OS of the PC that runs the code.
so please any one knows an API or any thing like this please tell.
Note: i tried "getsysteminfo" but it gives very low level informations which i don't need.
thanks in advance
|
|
|
|
|