内核技术中文网»首页 论坛 圈点 查看内容

0 评论

0 收藏

分享

这个代码播放失效,错的吧

非常抱歉,我的错误。以下是一个修正后的代码示例,以使用DirectSound播放器实现播放、暂停和停止功能:

#include <Windows.h>
#include <dsound.h>

#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "dxguid.lib")

LPDIRECTSOUND8 g_pDS = NULL;
LPDIRECTSOUNDBUFFER g_pDSBuffer = NULL;

bool InitializeDirectSound(HWND hWnd)
{
    if (FAILED(DirectSoundCreate8(NULL, &g_pDS, NULL)))
        return false;

    if (FAILED(g_pDS->SetCooperativeLevel(hWnd, DSSCL_PRIORITY)))
        return false;

    WAVEFORMATEX waveFormat;
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 2;
    waveFormat.nSamplesPerSec = 44100;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = (waveFormat.nChannels * waveFormat.wBitsPerSample) / 8;
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;

    DSBUFFERDESC dsbd;
    memset(&dsbd, 0, sizeof(DSBUFFERDESC));
    dsbd.dwSize = sizeof(DSBUFFERDESC);
    dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;

    if (FAILED(g_pDS->CreateSoundBuffer(&dsbd, &g_pDSBuffer, NULL)))
        return false;

    if (FAILED(g_pDSBuffer->SetVolume(DSBVOLUME_MAX))) // 设置最大音量
        return false;

    dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN;
    dsbd.dwBufferBytes = waveFormat.nAvgBytesPerSec * 5; // 5秒缓冲区
    dsbd.lpwfxFormat = &waveFormat;

    if (FAILED(g_pDS->CreateSoundBuffer(&dsbd, &g_pDSBuffer, NULL)))
        return false;

    return true;
}

bool LoadWaveFile(const char* filename)
{
    FILE* file;
    fopen_s(&file, filename, "rb");
    if (!file)
        return false;

    fseek(file, 0, SEEK_END);
    int fileSize = ftell(file);
    fseek(file, 0, SEEK_SET);

    BYTE* waveData = new BYTE[fileSize];

    if (!waveData)
    {
        fclose(file);
        return false;
    }

    fread(waveData, sizeof(BYTE), fileSize, file);
    fclose(file);

    void* buffer1;
    DWORD bufferSize1;
    void* buffer2;
    DWORD bufferSize2;

    if (FAILED(g_pDSBuffer->Lock(0L, fileSize, &buffer1,
        &bufferSize1,
        &buffer2,
        &bufferSize2,
        NULL)))
    {
        delete[] waveData;
        return false;
    }

    memcpy(buffer1, waveData, bufferSize1);
    memcpy(buffer2, waveData + bufferSize1 / sizeof(BYTE), bufferSize2);

    g_pDSBuffer->Unlock(buffer1,
                        bufferSize1,
                        buffer2,
                        bufferSize2);

    delete[] waveData;

    return true;
}

void PlaySound()
{
    g_pDSBuffer->Play(0UL , 0UL , DSBPLAY_LOOPING);
}

void PauseSound()
{
    g_pDSBuffer->Stop();
}

void StopSound()
{
    g_pDSBuffer->Stop();
    g_pDSBuffer->SetCurrentPosition(0L); // 设置播放位置为开头
}

void ReleaseDirectSound()
{
    if (g_pDSBuffer)
    {
        g_pDSBuffer->Release();
        g_pDSBuffer = NULL;
    }

    if (g_pDS)
    {
        g_pDS->Release();
        g_pDS = NULL;
    }
}

// 示例用法
int main()
{
    HWND hWnd = GetConsoleWindow(); // 获取控制台窗口句柄
    InitializeDirectSound(hWnd); // 初始化DirectSound

    if (LoadWaveFile("sound.wav")) // 加载音频文件
    {
        PlaySound(); // 播放音频

        Sleep(5000); // 延时5秒

        PauseSound(); // 暂停播放

        Sleep(2000); // 延时2秒

        PlaySound(); // 继续播放

        Sleep(3000); // 延时3秒

        StopSound(); // 停止播放
    }

    ReleaseDirectSound(); // 释放资源

    return 0;
}

此代码示例应该可以正常运行,并且支持基本的播放、暂停和停止操作。请确保将sound.wav替换为您自己的音频文件路径。如果仍然遇到问题,请提供更多详细信息,以便我可以帮助您进一步解决。<br/><br/><br/><p style="color:#CCCCCC;font-size:12px;">内容由零声教学AI助手提供,问题来源于学员提问</p>

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
主题 6339
回复 0
粉丝 0
扫码获取每晚技术直播链接
快速回复 返回顶部 返回列表