我想要在播放WAV檔的同時,利用TrackBar直接調整播放的速度.. 我看過版上的類似問題,是利用取樣率來修改.. <textarea class="cpp" rows="10" cols="60" name="code">TMemoryStream *wav_stream=new TMemoryStream();
wav_stream->LoadFromFile(wavname);
long newSamplingRate=52000;
wav_stream->Position=24;
wav_stream->Write(&newSamplingRate,4);</textarea>
可是在寫記憶體放音的時候,要怎樣即時去修改標頭檔的取樣率呢? 以下是我參考書上的記憶體放音的程式.. 請各位高手幫忙,謝謝..
<textarea class="cpp" rows="10" cols="60" name="code">
void __fastcall Tf14_5_1::btnPlayClick(TObject *Sender)
{
char szOpenError[] = "Open device Error!"; if(pVoiceBuffer == NULL)
{
MessageDlg("No data for playing!",mtWarning,TMsgDlgButtons()<Enabled = true;
dwDataSize = lFileSize;
pFormat.wFormatTag = WAVE_FORMAT_PCM;
pFormat.nChannels = sChannels;
pFormat.nSamplesPerSec = lSamplingRate; if(sBitsPerSample == 8)
{
pFormat.nAvgBytesPerSec = lSamplingRate * sChannels * (sBitsPerSample / 8);
pFormat.nBlockAlign = sChannels * (sBitsPerSample / 8);
pFormat.wBitsPerSample = 8;
}
else // 16 bits
{
pFormat.nAvgBytesPerSec = lSamplingRate * sChannels * (sBitsPerSample / 8);
pFormat.nBlockAlign = sChannels * (sBitsPerSample / 8);;
pFormat.wBitsPerSample = 16;
} pFormat.cbSize = 0; if( !(waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER,(LPWAVEFORMATEX)&pFormat
,(DWORD)f14_5_1->Handle, 0, 0) == MMSYSERR_NOERROR) )
{
MessageDlg(szOpenError,mtInformation,TMsgDlgButtons()<Enabled = false;
// Allocate and lock memory for the header.
hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD)sizeof(WAVEHDR));
if(hWaveHdr == NULL)
{
MessageDlg("Not enough memory for header.",mtInformation,TMsgDlgButtons()<lpData = (char *)pVoiceBuffer;
lpWaveHdr->dwBufferLength = lFileSize;
lpWaveHdr->dwFlags = 0L; //WHDR_BEGINLOOP | WHDR_ENDLOOP;
lpWaveHdr->dwLoops = 0L; //
//
if(waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
{
MessageDlg("WaveOutPrepareHeader Error 1!",mtInformation,TMsgDlgButtons()<ProcessMessages();
}
if(waveOutReset(hWaveOut) != MMSYSERR_NOERROR)
{
MessageDlg("WaveOutReset Error!",mtInformation,TMsgDlgButtons()<Enabled = true;
btnStop->Enabled = false;
}
}
</textarea>