Здравствуйте dennisV, Вы писали:
V>Помогите, пожалуйста!
V>Есть ли реальная возможность (впрочем нереальная тоже подойдет) проиграть waveaudio, используя обычные mciSendString (или command), но не с диска, а из буффера в памяти?
может и можно ... :о) точно не знаю. Я бы поюзал DirectSound. Если звуковой файл не очень длинный то можно даже без использования stream
например:
#define INITGUID
#include <dsound.h>
#include <iostream>
#include <time.h>
#include <ks.h> // GUID_NULL
LPDIRECTSOUND8 pDSound = NULL;
LPDIRECTSOUNDBUFFER pDSPrimaryBuffer = NULL;
LPDIRECTSOUNDBUFFER pDSSecondaryBuffer = NULL;
int Exit()
{
getchar();
if (pDSPrimaryBuffer) { pDSPrimaryBuffer->Release(); pDSPrimaryBuffer = NULL; }
if (pDSSecondaryBuffer) { pDSSecondaryBuffer->Release(); pDSSecondaryBuffer = NULL; }
if (pDSound) { pDSound->Release(); pDSound = NULL; }
CoUninitialize();
return 0;
}
int main(int argc, char* argv[])
{
HRESULT hResult;
if (FAILED(CoInitialize(NULL))) { std::cout << "CoInitialize FAIL\n"; return Exit(); }
// create Direct Sound device
DirectSoundCreate8(NULL, &pDSound, NULL);
if (!pDSound) { std::cout << "Direct Sound object not created\n"; return Exit(); }
else std::cout << "Direct Sound object created\n";
// check compatibles
DSCAPS m_DScaps;
memset(&m_DScaps, 0, sizeof(m_DScaps));
m_DScaps.dwSize = sizeof(m_DScaps);
hResult = pDSound->GetCaps(&m_DScaps);
if (FAILED(hResult)) { std::cout << "Error in GetCaps, error code:" << hResult << "\n"; return Exit(); }
else std::cout << "GetCaps OK\n";
if (m_DScaps.dwFlags & DSCAPS_EMULDRIVER) std::cout << " Direct Sound driver not present. Use software emulation.\n";
else std::cout << " Direct Sound driver present.\n";
if (m_DScaps.dwFlags & DSCAPS_PRIMARYSTEREO) std::cout << " Primary stereo mode avalible.\n";
if (m_DScaps.dwFlags & DSCAPS_SECONDARYSTEREO) std::cout << " Hardware mixed stereo mode avalible.\n";
// set cooperative level
hResult = pDSound->SetCooperativeLevel(GetForegroundWindow(), DSSCL_PRIORITY);
if (FAILED(hResult)) { std::cout << "Error in SetCooperativeLevel, error code:" << hResult << "\n"; return Exit(); }
else std::cout << "SetCooperativeLevel - DSSCL_PRIORITY\n";
// create secondary sound buffer
DSBUFFERDESC m_DSBufferDesc;
WAVEFORMATEX m_waveFormatEx;
m_waveFormatEx.wFormatTag = WAVE_FORMAT_PCM;
m_waveFormatEx.cbSize = 0; // ignore for WAVE_FORMAT_PCM
m_waveFormatEx.nChannels = 2; // stereo (1 - mono)
m_waveFormatEx.nSamplesPerSec = 44100; // 44.1 kHz
m_waveFormatEx.wBitsPerSample = 16; // 16 bit (or 8)
m_waveFormatEx.nBlockAlign = m_waveFormatEx.wBitsPerSample / 8 * m_waveFormatEx.nChannels;
m_waveFormatEx.nAvgBytesPerSec = m_waveFormatEx.nSamplesPerSec * m_waveFormatEx.nBlockAlign;
memset(&m_DSBufferDesc, 0, sizeof(m_DSBufferDesc));
m_DSBufferDesc.dwSize = sizeof(m_DSBufferDesc);
m_DSBufferDesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GLOBALFOCUS;
// задаем размер буфера под звук
m_DSBufferDesc.dwBufferBytes = 44100/*Hz*/ * 10/*sec*/ * 2/*16 bit per sample*/ * 2/*2 chanel*/;
m_DSBufferDesc.guid3DAlgorithm = DS3DALG_DEFAULT;
m_DSBufferDesc.lpwfxFormat = &m_waveFormatEx;
hResult = pDSound->CreateSoundBuffer(&m_DSBufferDesc, &pDSSecondaryBuffer, NULL);
if (FAILED(hResult)) { std::cout << "Error in CreateSoundBuffer(secondary), error code:" << hResult << "\n"; return Exit(); }
else std::cout << "CreateSoundBuffer(secondary) OK\n";
// fill secondary buffer
void *buffer1 = NULL;
DWORD dwBufferSize1 = 0;
hResult = pDSSecondaryBuffer->Lock(0, 0, &buffer1, &dwBufferSize1, NULL, 0, DSBLOCK_ENTIREBUFFER);
if (FAILED(hResult)) { std::cout << "Error in Lock(secondary), error code:" << hResult << "\n"; return Exit(); }
// копируем данные из твоего буфера в буфер DirectSound
memcpy(buffer1, pointerYourBUFFER, dwBufferSize1);
hResult = pDSSecondaryBuffer->Unlock(buffer1, dwBufferSize1, NULL, 0);
if (FAILED(hResult)) { std::cout << "Error in Unlock(secondary), error code:" << hResult << "\n"; return Exit(); }
pDSSecondaryBuffer->SetCurrentPosition(0);
// play secondary buffer
hResult = pDSSecondaryBuffer->Play(0, 0, 0/*DSBPLAY_LOOPING*/);
if (FAILED(hResult)) { std::cout << "Error in Play(secondary), error code:" << hResult << "\n"; return Exit(); }
else std::cout << "Play(secondary) OK\n";
getchar();
// stop secondary
hResult = pDSSecondaryBuffer->Stop();
if (FAILED(hResult)) { std::cout << "Error in Stop(secondary), error code:" << hResult << "\n"; return Exit(); }
else std::cout << "Stop(secondary) OK\n";
return Exit();
}