設置 | 登錄 | 註冊

目前共有20篇帖子。

關於華碩VM520U筆記本裝64位win7後音箱老是自動休眠,聲音卡頓播放不正常的解決辦法

1樓 巨大八爪鱼 2026-3-13 23:01
具體現象:只要超過5秒鐘沒有播放聲音,音箱就會自動休眠,再次播放聲音時前幾秒卡頓聽不見,後面的內容才正常。音箱喚醒的速度太慢了。
除非用Windows Media Player播放一小段音樂後暫停,在不退出播放器的情況下,音箱不會休眠,系統聲音才不會卡頓。一旦關閉播放器,音箱又會在空閒時段休眠,聲音又會開始卡頓。

聲卡驅動名稱:Realtek High Definition Audio Driver
聲卡驅動版本:2017/4/11 6.0.1.8117

解決辦法:
在Visual Studio 2019下用C語言編寫一個DirectSound8播放wav聲音的程序,並且一開始播放就馬上暫停,開機的時候運行就行了。
程序下載地址:https://github.com/zlk12142/keep_speaker_alive/blob/main/Release/keep_speaker_alive.exe
下載後在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup文件夾下創建keep_speaker_alive.exe的快捷方式,開機的時候自動運行,防止聲卡自動睡眠。
C語言代碼:https://github.com/zlk12142/keep_speaker_alive/blob/main/keep_speaker_alive/main.c
代碼裏面generate_sound_data函數用sin生成了一段正弦波音頻數據。
用IDirectSoundBuffer8_SetVolume函數設置播放音量為0%(DSBVOLUME_MIN)。
調用IDirectSoundBuffer8_Play函數開始播放,一開始播放馬上又用IDirectSoundBuffer8_Stop函數暫停播放。
只要程序保持運行不退出,聲卡就不會休眠。
2樓 巨大八爪鱼 2026-3-13 23:03
3樓 巨大八爪鱼 2026-3-13 23:04
4樓 巨大八爪鱼 2026-3-13 23:05
5樓 巨大八爪鱼 2026-3-13 23:15
6樓 巨大八爪鱼 2026-3-13 23:16
7樓 巨大八爪鱼 2026-3-13 23:16

C語言程序代碼:

#include <initguid.h>
#include <dsound.h>
#include <math.h>
#include <tchar.h>

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

IDirectSound8 *pds8 = NULL;
IDirectSoundBuffer *pdsbuf = NULL;
IDirectSoundBuffer8 *pdsbuf8 = NULL;

void generate_sound_data(char *mem, int len)
{
    char value;
    int i;

    for (i = 0; i < len; i += 2)
    {
        value = (char)(sin(i / 20.0) * 127);
        mem[i] = value;
        mem[i + 1] = value;
    }
}

void play_sound(HWND hwnd)
{
    void *mem;
    DSBUFFERDESC dsbufdesc = {0};
    DWORD len;
    HRESULT hr;
    WAVEFORMATEX wavefmt = {0};

    hr = DirectSoundCreate8(NULL, &pds8, NULL);
    if (SUCCEEDED(hr))
    {
        IDirectSound8_SetCooperativeLevel(pds8, hwnd, DSSCL_NORMAL);
        dsbufdesc.dwSize = sizeof(DSBUFFERDESC);
        dsbufdesc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
        dsbufdesc.lpwfxFormat = &wavefmt;
        wavefmt.cbSize = sizeof(WAVEFORMATEX);
        wavefmt.wFormatTag = WAVE_FORMAT_PCM;
        wavefmt.nChannels = 2;
        wavefmt.nSamplesPerSec = 8000;
        wavefmt.wBitsPerSample = 8;
        wavefmt.nBlockAlign = wavefmt.nChannels * wavefmt.wBitsPerSample / 8;
        wavefmt.nAvgBytesPerSec = wavefmt.nSamplesPerSec * wavefmt.nBlockAlign;
        dsbufdesc.dwBufferBytes = DSBSIZE_FX_MIN * wavefmt.nAvgBytesPerSec;
        hr = IDirectSound8_CreateSoundBuffer(pds8, &dsbufdesc, &pdsbuf, NULL);
        if (SUCCEEDED(hr))
        {
            hr = IDirectSoundBuffer_QueryInterface(pdsbuf, &IID_IDirectSoundBuffer8, &pdsbuf8);
            if (SUCCEEDED(hr))
            {
                hr = IDirectSoundBuffer8_Lock(pdsbuf8, 0, 0, &mem, &len, NULL, NULL, DSBLOCK_ENTIREBUFFER);
                if (SUCCEEDED(hr))
                {
                    generate_sound_data(mem, len);
                    IDirectSoundBuffer8_Unlock(pdsbuf8, mem, len, NULL, 0);
                    mem = NULL;

                    IDirectSoundBuffer8_SetCurrentPosition(pdsbuf8, 0);
                    IDirectSoundBuffer8_SetVolume(pdsbuf8, DSBVOLUME_MIN);
                    //IDirectSoundBuffer8_SetVolume(pdsbuf8, DSBVOLUME_MIN + 8000);
                    IDirectSoundBuffer8_Play(pdsbuf8, 0, 0, DSBPLAY_LOOPING);
                    IDirectSoundBuffer8_Stop(pdsbuf8);
                }
            }
        }
    }
}

void stop_sound()
{
    if (pdsbuf8 != NULL)
    {
        IDirectSoundBuffer8_Release(pdsbuf8);
        pdsbuf8 = NULL;
    }
    if (pdsbuf != NULL)
    {
        IDirectSoundBuffer_Release(pdsbuf);
        pdsbuf = NULL;
    }
    if (pds8 != NULL)
    {
        IDirectSound8_Release(pds8);
        pds8 = NULL;
    }
}

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_CREATE:
        play_sound(hwnd);
        break;
    case WM_DESTROY:
        stop_sound();
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

int WINAPI _tWinMain(HINSTANCE instance, HINSTANCE prev_instance, LPTSTR cmdline, int cmdshow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wcex = {0};

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hInstance = instance;
    wcex.lpfnWndProc = wnd_proc;
    wcex.lpszClassName = TEXT("main_window");
    RegisterClassEx(&wcex);

    hwnd = CreateWindow(wcex.lpszClassName, TEXT("keep_speaker_alive"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, instance, NULL);
    //ShowWindow(hwnd, cmdshow);
    UpdateWindow(hwnd);
    
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

8樓 巨大八爪鱼 2026-3-13 23:23
https://tieba.baidu.com/p/10556037212#
9樓 巨大八爪鱼 2026-3-14 00:56
10樓 巨大八爪鱼 2026-3-14 01:03
https://zhuanlan.zhihu.com/p/2015954785333954357

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張