目前共有11篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
51 10
关于华硕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
 
一派掌門 二十級
9樓 發表于:2026-3-14 00:56
 
一派掌門 二十級
10樓 發表于:2026-3-14 01:03
 
一派掌門 二十級
11樓 發表于:2026-3-14 01:04
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:51 回複數:10
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2026-3-14 01:04
 
©2010-2026 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。