Newsgroup: it.comp.lang.c++
Titolo: casting da LPSTR a PBYTE

Salve,
     in questo momento per capire meglio il concetto di classe e 
programmazione orientata agli oggetti in C++ sto scrivendo una classe per 
usare in modo pi� semplice la waveForm API di windows.
la classe si chiama [b]waveCapture[/b] ed � composta naturalmente da due 
files:
[i]waveCapture.h[/i]
[i]waveCapture.cpp[/i]
I metodi della classe sono i seguenti:
[quote]
// Costruttori e distruttore
waveCapture();
waveCapture(DWORD dwSamplePerSec, WORD wBitsPerSample, WORD nChannels);
~waveCapture();
// Start Capturing WAVE
BOOL start();
BOOL start(WORD uDevice);
BOOL start(WORD uDevice, DWORD dwBufferLength, DWORD dwNumBuffers);
// Get Buffer (return bytes captured)
DWORD getBuffer(PBYTE pWAVBuffer);
// Stop Capturing
BOOL stop();
[/quote]
di seguito mostro come si usa la classe in main()
[code]
#include "waveCapture.h"
int main()
{
 waveCapture* pwc = new waveCapture(); // Default: 44100, 16 (bit), 2 
(STEREO)
 pwc->start(0, 176400, 3); // (microfono interno, 176400 bytes, 3 buffers)
 PBYTE pWAVBuffer      = new BYTE[176400];
 DWORD dwBytesRecorded = 0;
 dwBytesRecorded = pwc->getBuffer(pWAVBuffer);
 dwBytesRecorded = pwc->getBuffer(pWAVBuffer);
 //...etc...oppure:
 while( dwBytesRecorded = pwc->getBuffer(pWAVBuffer) > 0 )
 {
  //...do something with pWAVBuffer...
 }
 pwc->stop();
 return 0;
}
[/code]
Quindi ogni volta che chiamo [b]getBuffer();[/b] passo un puntatore ad un 
blocco di memoria BYTE che verr� riempito dalla fun<ione. La funzione poi 
ritorner� il numero di bytes realmente catturati. La funzione � bloccante e 
ritorna il primo buffer pronto. (all'interno viene usata la CALLBACK_EVENT)
questa � la struttura della classe nel file header:
[code]
class waveCapture
{
public:
 // Constructors:
 waveCapture();
 ~waveCapture();
 waveCapture(DWORD, WORD, WORD);
 // Methods:
 BOOL start();
 BOOL start(WORD);
 BOOL start(WORD, DWORD, DWORD);
 BOOL stop();
 DWORD getBuffer(PBYTE);
private:
 HANDLE hevent;
 HWAVEIN hwi;
 WAVEFORMATEX wf;
 WAVEHDR *buff;
 DWORD _dwBufferCount;
 DWORD dwTotalBufferLength;
}
[/code]
il lavoro � svolto per la maggior parte da [b]start()[/b] e 
[b]getBuffer()[/b] che hanno in comune /WAVEHDR *buff/, /HWAVEIN hwi/ e 
sopratutto /WAVEHDR *buff/
Ora vi mostro la funzione membro [b]getBuffer()[/b] che � quella che mi da 
problemi (in quanto ritorna 0 e un puntatore vuoto):
[code]
DWORD waveCapture::getBuffer(PBYTE pWAVBuffer)
{
 DWORD _dwBytesRecorded = 0;
 // CALLBACK EVENT
 WaitForSingleObject(hevent, INFINITE);
 if(buff[_dwBufferCount].dwFlags & WHDR_DONE)
 {
  _dwBytesRecorded = buff[_dwBufferCount].dwBytesRecorded;
  pWAVBuffer      = (PBYTE)buff[_dwBufferCount].lpData;
  waveInAddBuffer(hwi, &buff[_dwBufferCount], sizeof(WAVEHDR));
 }
 if(_dwBufferCount == __dwNumBuffers -1)
 {
  _dwBufferCount = 0;
 } else {
  _dwBufferCount++;
 }
 dwTotalBufferLength += _dwBytesRecorded;
 return _dwBytesRecorded;
}
[/code]
volevo sapere se sto facendo bene il casting:
[code]
PBYTE pWAVBuffer = (PBYTE)buff[_dwBufferCount].lpData;
[/code]
in quanto buff.lpData � nativo in LPSTR ed io dovrei portarlo a PBYTE
per completezza posto anche il codice della funzione membro start() 
(sintetizzata)
[code]
BOOL waveCapture::start()
{
 // ...let's get straight to the gist...
 // Define WAVEFORMATEX Structure (WAVEFORMATEX wf)
 (...)
 // Create event:
 hevent = CreateEvent(NULL,0,0,NULL);
 // WaveInOpen
 waveInOpen(&hwi,uDevice,(LPWAVEFORMATEX)&wf,(DWORD)hevent,0,CALLBACK_EVENT); // Define WAVEHDR Structure: buff = new WAVEHDR[dwNumBuffers]; // Push buffers: waveInPrepareHeader(hwi, &buff[i], sizeof(WAVEHDR)); waveInAddBuffer(hwi, &buff[i], sizeof(WAVEHDR)); // Start capturing... waveInStart(hwi); _dwBufferCount = 0; return true;}[/code]forse sono andato un p� troppo per le lunghe...grazie

 
Ma buff � quindi un puntatore a strutture WAVEHDR giusto?
Spero correttamente allocate con una cosa del tipo:
buff = new WAVEHDR[ N ];
Se questo � ok, allora proverei magari a mettere una parentesi
tre (PBYTE) e buff.
Non ho guardato benissimo tutto il codice per�, sappilo.
Ciau!