本文整理汇总了C++中LPDIRECTSOUNDBUFFER::GetFormat方法的典型用法代码示例。如果您正苦于以下问题:C++ LPDIRECTSOUNDBUFFER::GetFormat方法的具体用法?C++ LPDIRECTSOUNDBUFFER::GetFormat怎么用?C++ LPDIRECTSOUNDBUFFER::GetFormat使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LPDIRECTSOUNDBUFFER
的用法示例。
在下文中一共展示了LPDIRECTSOUNDBUFFER::GetFormat方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: write
void DirectSound::write()
{
int len = soundBufferLen;
LPVOID lpvPtr1;
DWORD dwBytes1;
LPVOID lpvPtr2;
DWORD dwBytes2;
if(!pDirectSound)
return;
if(theApp.soundRecording) {
if(dsbSecondary) {
if(theApp.soundRecorder == NULL) {
theApp.soundRecorder = new WavWriter;
WAVEFORMATEX format;
dsbSecondary->GetFormat(&format, sizeof(format), NULL);
if(theApp.soundRecorder->Open(theApp.soundRecordName))
theApp.soundRecorder->SetFormat(&format);
}
}
if(theApp.soundRecorder) {
theApp.soundRecorder->AddSound((u8 *)soundFinalWave, len);
}
}
if(theApp.aviRecording) {
if(theApp.aviRecorder) {
if(dsbSecondary) {
if(!theApp.aviRecorder->IsSoundAdded()) {
WAVEFORMATEX format;
dsbSecondary->GetFormat(&format, sizeof(format), NULL);
theApp.aviRecorder->SetSoundFormat(&format);
}
}
theApp.aviRecorder->AddSound((const char *)soundFinalWave, len);
}
}
HRESULT hr;
if(!speedup && synchronize && !theApp.throttle) {
DWORD status=0;
hr = dsbSecondary->GetStatus(&status);
if(status && DSBSTATUS_PLAYING) {
if(!soundPaused) {
DWORD play;
while(true) {
dsbSecondary->GetCurrentPosition(&play, NULL);
if(play < soundNextPosition ||
play > soundNextPosition+soundBufferLen) {
break;
}
if(dsbEvent) {
WaitForSingleObject(dsbEvent, 50);
}
}
}
} else {
soundPaused = 1;
}
}
// Obtain memory address of write block. This will be in two parts
// if the block wraps around.
hr = dsbSecondary->Lock(soundNextPosition, soundBufferLen, &lpvPtr1,
&dwBytes1, &lpvPtr2, &dwBytes2,
0);
// If DSERR_BUFFERLOST is returned, restore and retry lock.
if (DSERR_BUFFERLOST == hr) {
dsbSecondary->Restore();
hr = dsbSecondary->Lock(soundNextPosition, soundBufferLen,&lpvPtr1,
&dwBytes1, &lpvPtr2, &dwBytes2,
0);
}
soundNextPosition += soundBufferLen;
soundNextPosition = soundNextPosition % soundBufferTotalLen;
if SUCCEEDED(hr) {
// Write to pointers.
CopyMemory(lpvPtr1, soundFinalWave, dwBytes1);
if (NULL != lpvPtr2) {
CopyMemory(lpvPtr2, soundFinalWave+dwBytes1, dwBytes2);
}
// Release the data back to DirectSound.
hr = dsbSecondary->Unlock(lpvPtr1, dwBytes1, lpvPtr2,
dwBytes2);
}
}
示例2: run
//.........这里部分代码省略.........
break;
}
if (! g.s.doPositionalAudio())
dwMask = KSAUDIO_SPEAKER_MONO;
for (int i=0;i<32;i++) {
if (dwMask & (1 << i)) {
chanmasks[ns++] = 1 << i;
}
}
iMixerFreq = SAMPLE_RATE;
iChannels = ns;
eSampleFormat = SampleShort;
iByteSize = iFrameSize * sizeof(short) * ns;
ZeroMemory(&wfxSet, sizeof(wfxSet));
wfxSet.Format.wFormatTag = WAVE_FORMAT_PCM;
ZeroMemory(&wfx, sizeof(wfx));
wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
wfx.Format.nChannels = qMax(ns, 1);
wfx.Format.nSamplesPerSec = SAMPLE_RATE;
wfx.Format.nBlockAlign = sizeof(short) * wfx.Format.nChannels;
wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign;
wfx.Format.wBitsPerSample = 16;
if (FAILED(hr = pDSBPrimary->SetFormat(reinterpret_cast<WAVEFORMATEX *>(&wfx)))) {
qWarning("DXAudioOutput: SetFormat failed: hr=0x%08lx", hr);
goto cleanup;
}
if (FAILED(hr = pDSBPrimary->GetFormat(reinterpret_cast<WAVEFORMATEX *>(&wfxSet), sizeof(wfxSet), NULL))) {
qWarning("DXAudioOutput: GetFormat failed: hr=0x%08lx", hr);
goto cleanup;
}
qWarning("DXAudioOutput: Primary buffer of %ld Hz, %d channels, %d bits",wfxSet.Format.nSamplesPerSec,wfxSet.Format.nChannels,wfxSet.Format.wBitsPerSample);
ZeroMemory(&wfx, sizeof(wfx));
wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wfx.Format.nChannels = ns;
wfx.Format.nSamplesPerSec = SAMPLE_RATE;
wfx.Format.nBlockAlign = sizeof(short) * wfx.Format.nChannels;
wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign;
wfx.Format.wBitsPerSample = 16;
wfx.Format.cbSize = 32;
wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample;
wfx.dwChannelMask = dwMask;
wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
dsbdesc.dwFlags = DSBCAPS_GLOBALFOCUS|DSBCAPS_GETCURRENTPOSITION2;
dsbdesc.dwFlags |= DSBCAPS_CTRLPOSITIONNOTIFY;
dsbdesc.dwBufferBytes = wfx.Format.nChannels * iFrameSize * sizeof(short) * NBLOCKS;
dsbdesc.lpwfxFormat = reinterpret_cast<WAVEFORMATEX *>(&wfx);
if (FAILED(hr = pDS->CreateSoundBuffer(&dsbdesc, &pDSBOutput, NULL))) {
qWarning("DXAudioOutputUser: CreateSoundBuffer (Secondary) failed: hr=0x%08lx", hr);
goto cleanup;
}
if (FAILED(hr = pDSBOutput->QueryInterface(IID_IDirectSoundNotify, reinterpret_cast<void **>(&pDSNotify)))) {
示例3: sizeof
// playing thread
static DWORD __stdcall dsound_play_thread(void *param) {
// primary buffer caps
DSBCAPS caps;
caps.dwSize = sizeof(caps);
primary_buffer->GetCaps(&caps);
// primary buffer format
WAVEFORMATEX format;
primary_buffer->GetFormat(&format, sizeof(format), NULL);
// timer resolustion
timeBeginPeriod(1);
// temp buffer for vsti process
float output_buffer[2][4096];
// data write posision
int write_position = 0;
// start playing primary buffer
primary_buffer->Play(0, 0, DSBPLAY_LOOPING);
while (dsound_thread) {
DWORD play_pos, write_pos;
// get current position
primary_buffer->GetCurrentPosition(&play_pos, &write_pos);
// size left in buffer to write.
int data_buffer_size = (caps.dwBufferBytes + write_position - write_pos) % caps.dwBufferBytes;
// write buffer size
int write_buffer_size = buffer_size * format.nBlockAlign;
// size left in buffer
int write_size = write_buffer_size - data_buffer_size;
// maybe data buffer is underflowed.
if (write_size < 0) {
write_size = (caps.dwBufferBytes + write_pos + write_buffer_size - write_position) % caps.dwBufferBytes;
}
// write data at least 32 samles
if (write_size >= 32 * format.nBlockAlign) {
//printf("%8d, %8d, %8d, %8d, %8d\n", timeGetTime(), (caps.dwBufferBytes + write_position + write_size - write_pos) % caps.dwBufferBytes, write_pos, write_size, write_buffer_size);
// samples
uint samples = write_size / format.nBlockAlign;
if (export_rendering()) {
memset(output_buffer[0], 0, samples * sizeof(float));
memset(output_buffer[1], 0, samples * sizeof(float));
} else {
// update
song_update(1000.0 * (double)samples / (double)format.nSamplesPerSec);
// call vsti process func
vsti_update_config((float)format.nSamplesPerSec, 4096);
vsti_process(output_buffer[0], output_buffer[1], samples);
}
// lock primary buffer
void *ptr1, *ptr2;
DWORD size1, size2;
HRESULT hr = primary_buffer->Lock(write_position, write_size, &ptr1, &size1, &ptr2, &size2, 0);
// device lost, restore and try again
if (DSERR_BUFFERLOST == hr) {
primary_buffer->Restore();
hr = primary_buffer->Lock(write_position, write_size, &ptr1, &size1, &ptr2, &size2, 0);
}
// lock succeeded
if (SUCCEEDED(hr)) {
float *left = output_buffer[0];
float *right = output_buffer[1];
uint samples1 = size1 / format.nBlockAlign;
uint samples2 = size2 / format.nBlockAlign;
if (ptr1) write_buffer((short *)ptr1, left, right, samples1);
if (ptr2) write_buffer((short *)ptr2, left + samples1, right + samples1, samples2);
hr = primary_buffer->Unlock(ptr1, size1, ptr2, size2);
write_position = (write_position + write_size) % caps.dwBufferBytes;
}
} else {
Sleep(1);
}
}
// stop sound buffer
primary_buffer->Stop();
// timer resolustion
timeEndPeriod(10);
//.........这里部分代码省略.........