首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectSound:简单的pcm播放

DirectSound:简单的pcm播放
EN

Stack Overflow用户
提问于 2012-04-23 21:21:23
回答 1查看 3.1K关注 0票数 3

我正在使用DirectSound,并尝试使用以下代码播放简单的随机wav数据:

代码语言:javascript
复制
int _tmain(int argc, _TCHAR* argv[])
{
    LPDIRECTSOUND8 dsound;
    WAVEFORMATEX format;
    const int numchunks = 8;
    LPDIRECTSOUNDBUFFER dsbuf;
    DSBUFFERDESC buf_format;
    const int chunksize = 1024;
    HRESULT res;
    uint8_t *data1,*data2;
    uint32_t size1,size2;

    memset(&format,0,sizeof(WAVEFORMATEX));

    format.wFormatTag = WAVE_FORMAT_PCM;
    format.nChannels  = 1;
    format.wBitsPerSample = 16;
    format.nSamplesPerSec = 44100;
    format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
    format.nAvgBytesPerSec = format.nBlockAlign * format.nSamplesPerSec ;   
    format.cbSize = 0;

    assert(DirectSoundCreate8(NULL,&dsound,NULL) == DS_OK);


    assert(dsound->SetCooperativeLevel(GetDesktopWindow(),DSSCL_PRIORITY) == DS_OK);


    memset(&buf_format,0,sizeof(DSBUFFERDESC));
    buf_format.dwSize = sizeof(buf_format);
    buf_format.dwFlags = DSBCAPS_GETCURRENTPOSITION2;
    buf_format.dwFlags |= DSBCAPS_STICKYFOCUS;
    buf_format.dwBufferBytes = numchunks * chunksize;
    buf_format.dwReserved = 0;
    buf_format.lpwfxFormat = &format;


    res = dsound->CreateSoundBuffer(&buf_format,&dsbuf,NULL);
    assert(res == DS_OK );

    srand(time(NULL));

    assert(IDirectSoundBuffer_Lock(dsbuf,0,buf_format.dwBufferBytes,(LPVOID *)&data1,(LPDWORD)&size1,
                            (LPVOID *)&data2,(LPDWORD)&size2,DSBLOCK_ENTIREBUFFER) == DS_OK);

    cout << "got buffer with size "<<size1<<endl;

    for (uint32_t i = 0 ; i < size1; i ++)
        data1[i] = rand() % 256;

    IDirectSoundBuffer_Unlock(dsbuf,
                                  (LPVOID) data1, (DWORD)size1,
                                  (LPVOID) data2, (DWORD)size2);

    assert(IDirectSoundBuffer_Play(dsbuf,0,0,DSBPLAY_LOOPING) == DS_OK);


    cin.get();

    return 0;
}

但在输出中,我只听到无声。此外,输出没有错误,我的data1实际上是一些随机的东西。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-01 22:02:50

我遇到了您的一些问题,我通过将buf_format.dwFlags设置为buf_format.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GETCURRENTPOSITION2 |DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2;修复了您的代码

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10281360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档