感谢大家支持51Testing软件测试网!

消除笔记本的高频电流噪音

上一篇 / 下一篇  2008-11-18 22:10:47 / 个人分类:小娱乐

7K'[q8D0oK0摘要:有些笔记本在使用中发出一种高频电流噪音。这种噪音随着硬盘的读写,用户对窗口界面中的滚动条的拉动发生变化,并在操作系统启动之后几乎始终存在,只有当用户播放音频文件时这种噪音会消失。本文利用这一特点针对Windows操作系统给出了消除噪音解决方案。本文设计了一个占用资源较少的Windows系统服务,在里面模拟音频文件的播放,从而将噪音消除。

3v&riNt8~/|5l#rup0

^~YPS$]0关键字:笔记本高频电流噪音 Windows系统服务51Testing软件测试网.U1Dq-mK(gQ
51Testing软件测试网&i5{Y(J"C t

51Testing软件测试网?Kz?L[n

问题分析

0jg;P}$Y0

有些笔记本由于设计方面的问题,如果使用了USB设备或蓝牙模块,在运行中会发出一种高频电流噪音。例子包括Dell D610Think R60e(在使用电池的模式下)。这种噪音的来源并未得到官方的解释。但是有些厂商已经发布了修复这种噪音问题的BIOS补丁[1]。但是某些厂商并未正面解决这个问题[2]51Testing软件测试网g,D`uK4y_F,B0y

有一种比 较方便易行的方法可以把这种噪音消除:播放一个音频文件,然后按下暂停按钮。某些用户反映在运行一些游戏时也可以将噪音消除,其实也是利用了游戏背景音乐 的作用。但是这种方法的缺点是需要手工操作,并且音乐播放器往往占用大量的内存。我们应该考虑用一种节省的方式实现它。51Testing软件测试网6x0L y N+GB8md

y(Xz5a(k"w]Mle0设计与实现

/v,fSZ%W7MU4_0

Windows提供了一组波形音频的编程接口。我们可以利用它们模拟播放器的暂停状态:

OI7Y4RT mw1[ I9k*q0

2bov/h'N5A X1R,uGl0//代码模拟播放器的暂停状态
*Hv.F$B a G2N0
HWAVEOUT hWaveOut;          //波形音频输出句柄51Testing软件测试网 Ht_{ O ?8~"z
BYTE mute[MUTE_LENGTH];     //静音符号串51Testing软件测试网v[kT~WVY(\u \0N
WAVEFORMATEX waveformat = {
$Sg`YdJ V&vi0    WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 180
.J+y?xz0};                          //
设定波形音频的格式
)ka f*_}(K[0
WAVEHDR waveHdr = {
4A j3Pf n:D9_(L F0    0, MUTE_LENGTH, 0001, NULL, 051Testing软件测试网d$Z|2M? j!U z
};                          //
音频数据信息头
vJ[dH-l5?H0
51Testing软件测试网U ~ ^FB QH"iYP
FillMemory(mute, MUTE_LENGTH, (BYTE)0x80);  //
用静音符号填充51Testing软件测试网:AV0Xcq NzK
waveHdr.lpData = mute;                      //初始化信息头指针51Testing软件测试网0b)k+Q e&deS
//
打开音频设备
JSL1zS(a nq"{3s0
waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, 00, CALLBACK_FUNCTION);51Testing软件测试网*t gf"U"?Cn!w
//
准备信息头
!?7t'M U,v)~0
waveOutPrepareHeader (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;51Testing软件测试网k,gd1sU
//
播放静音符号
V'Hv-w.CED0
waveOutWrite (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;
#X&ffg,n+z0Ho0//
暂停
ud*u6A zW0
waveOutPause(hWaveOut) ;51Testing软件测试网'{6WFV f

利用这段代码写一个win32程序,保证程序进程不会退出(可利用一个含有Sleep调用的死循环或弹出一个模态对话框实现),即可实现消除噪音的作用。

\+mSt2e,`!^g(cQ`0

然而这样做仍然不够完善。我们希望系统在启动的时候,无论有用户登录与否,都能够自动地调用它。为了解决这一问题,我们应当把它改造为Windows的系统服务。

A;N+\[9F3y"@,T B;I0

Windows系统服务的编写需要服从一定的格式规范,请参阅相关文献[3],本文不予详述。需要注意的是,如果编写为独立的Windows服务,仍然需要1,900K左右的内存;如果编写为寄存在svchost中的服务[4],则可以把内存占用量大大降低,达到300~400K。本文采用了后者。

Hn3J,T&@&j D8l5r-u0

完整代码如下(我们把服务名取作DenoiseSvc31)

1s qE0CU i/D0

E#R#w'I2}9y)uC j0/*消电流噪声 svchost 3.1*/
m$A ^@2Lm;JD1k0#include <windows.h>51Testing软件测试网,q;mRW5sV$vM"C0f'{
#include <stdio.h>51Testing软件测试网"bf wVR B
51Testing软件测试网(o a C7r ^/IX}
#define SLEEP_TIME 1000051Testing软件测试网 P+l#t.bD r;?
#define SERVICE_NAME "DenoiseSvc31"
//
服务名
dr!R f(p0Foc0#define MUTE_LENGTH 12851Testing软件测试网3T_E4S1te
#define SAMPLE_RATE 11025
A.b*i8sg/E%{?0
51Testing软件测试网 w {u8J1VL]ng
SERVICE_STATUS          ServiceStatus;51Testing软件测试网)Y2C(r(D7v h
SERVICE_STATUS_HANDLE   hStatus;51Testing软件测试网 N'?/c&Nf2a

6\$K$\/P;V0\'d/K9g:s0void InitService(void) {51Testing软件测试网i)H/P ~@
    HWAVEOUT hWaveOut ;
sPy;c![2t%v0    BYTE mute[MUTE_LENGTH];51Testing软件测试网&j/D.Cw&[s
    WAVEFORMATEX waveformat = {
7z p7Y8C1N,A0        WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 18051Testing软件测试网tA~GNTW)@
    };
}s]I8A0    WAVEHDR waveHdr = {
#\3tR@|.p)gd,c0        0, MUTE_LENGTH, 0001, NULL, 0
'iy!T.v8aE p3l1]0    };
(f0[0R7? @_0
jm"vOZ6E7_ R"K'Q0    FillMemory(mute, MUTE_LENGTH, (BYTE)0x80);51Testing软件测试网 C-jQ,LM7kU
    waveHdr.lpData = mute;51Testing软件测试网IT pR6Q(|
    waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, 0,0,CALLBACK_FUNCTION);51Testing软件测试网,vlTj)Wob"I'W
    waveOutPrepareHeader (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;51Testing软件测试网R*i?`%t0q"f } K
    waveOutWrite (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;51Testing软件测试网|:L&k `%d[X
    waveOutPause(hWaveOut) ;
%R0? NSf a0}51Testing软件测试网 {9`4JID

c3W gN^,B0void ControlHandler(DWORD request)51Testing软件测试网%L Z5h+? t D8V;G4Z
{
"c5p{.pQ0    switch(request) {
*`g PF%\-O2Mj+qi b0    case SERVICE_CONTROL_STOP:51Testing软件测试网R cx\+H
    case SERVICE_CONTROL_SHUTDOWN:51Testing软件测试网Dbn8Z1P`*|$m A1yi
        ServiceStatus.dwWin32ExitCode = 0;51Testing软件测试网/UAF+w6G'dT#s
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;51Testing软件测试网S;R&t*e7e_ A
        SetServiceStatus (hStatus, &ServiceStatus);51Testing软件测试网7|9?B/J t/D0ho}
        return;51Testing软件测试网+E j0^\Oq p^kE
51Testing软件测试网"c._w iW]NG
    default:
L;]4@`a$m/?5[9C0        break;
k/V'`*R{@[0    }51Testing软件测试网-n?+vs0qVta
51Testing软件测试网gT w[_Z
    // Report current status51Testing软件测试网 cS D8O)t P
    SetServiceStatus (hStatus, &ServiceStatus);
L.H^;V`*L(@4b051Testing软件测试网:hS+^dnM
    return;
3WG(_/V*K;H9t0}
K!F.s8aYj'YCR,z051Testing软件测试网3f)q4Z"cA:A0[9Q
#pragma argsused
9M hVS(k*c8u+\c-I0
__declspec(dllexport) VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)51Testing软件测试网 J$^E#Xr8^0o@]TO
{51Testing软件测试网6W8V+_-H!I5Q
    ServiceStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
(`7w&BL+W!b@0b"e0    ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
Z5kk6A/w2W,GR0    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
f2Nxp h0        SERVICE_ACCEPT_SHUTDOWN;51Testing软件测试网g(A8vl.gv%s | B
    ServiceStatus.dwWin32ExitCode = 0;51Testing软件测试网 y&AW,lg^*ki u
    ServiceStatus.dwServiceSpecificExitCode = 0;
pfQ:P_+{(^']&H0    ServiceStatus.dwCheckPoint = 0;
d n/u ]y`(l0    ServiceStatus.dwWaitHint = 0;51Testing软件测试网 wi:@0[ FY
51Testing软件测试网0D/ToB*K6PA
    hStatus = RegisterServiceCtrlHandler( SERVICE_NAME,
)g;q4vRfRjz0        (LPHANDLER_FUNCTION)ControlHandler);51Testing软件测试网OqQ"Nq Rxz)G
    if (hStatus == (SERVICE_STATUS_HANDLE)0) {
4ngUV`&v0        // Registering Control Handler failed
SQQ*E5_1w%K0
        return;
6B5`#UO'n7Z6e\k0    }
\'gLm'}~{i Y0    // Initialize Service
,\(xim&J|.]0
    InitService();
V*J0S#A/X6\Io5q051Testing软件测试网~OqtCXT[3o;p.m
    // We report the running status to SCM.
d7|'\)J rMv0
    ServiceStatus.dwCurrentState = SERVICE_RUNNING;
)p1E(`"q d^0    SetServiceStatus (hStatus, &ServiceStatus);
&Z%p Nws051Testing软件测试网#UZ)t kNU+Qf*_
    // The worker loop of a service
8`K:V}0Q'cv-nn L+m`T0
    while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) {51Testing软件测试网7H"rAu'j j
        Sleep(SLEEP_TIME);51Testing软件测试网0n2d+|"\_$N(f e
    }
'xH&Z8k}6i:y&k/a0    return;51Testing软件测试网sv+Pl7x q
}
51Testing软件测试网CWt#p/{N_

Svchost服务要求可执行文件必须为动态链接库。我们把它编译为denoise.dll并拷贝到%windir%\system32目录下。剩下的任务就是把它安装到系统上。

*q4^Hh R+C6E r.W0

为系统添加一个服务需要修改注册表。对于Svchost服务,需要修改的地方包括:51Testing软件测试网o$@ FE7V#mQQ

Y@z:?InY)]4f-s$y0l        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost:把服务添加到某个Svchost组内。

%V?$e ^Q[ SNXt0

ff+AI%Zl9G0l        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:添加服务的主键及相关键值。

,U2?d&a C7[`0

代码如下:

.g*F oZccF7] NI/A0

:I1H0[:V'M@gP H7s0Windows Registry Editor Version 5.0051Testing软件测试网'S1hy)}3D9F{$l[

7\'pM1N9AW0 51Testing软件测试网L+av?? ~U!b

51Testing软件测试网FQtH,mwA-}

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31]

n n9Q8s,HF!p1A0

s:uo;g'K9VF"A0"Type"=dword:0000002051Testing软件测试网D9nx.C1e"ke.j

^\{#Y&o(}0"Start"=dword:0000000251Testing软件测试网$m Q{;]m\KW R

51Testing软件测试网+?+e8f3h"JN

"ErrorControl"=dword:0000000151Testing软件测试网Yt8F vS#tvv i

51Testing软件测试网3l'o%W A9aT2sw

"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\

Y9`4f4M%xj&P1L0

f|6X-bU2r(kl0 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\

U{ VuNLiQ`0

M)l2Y/e+_0 00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\

"a1@k9zh0

RY5h/X(C0 6b,00,20,00,48,00,54,00,54,00,50,00,46,00,69,00,6c,00,74,00,65,00,72,00,00,\51Testing软件测试网"X8?$}(cNr`R

51Testing软件测试网%I1[VC+A

 0051Testing软件测试网nd4vPW;V'P

51Testing软件测试网@A^ b+LeY

"DisplayName"="DenoiseSvc31"

tR:r6E.fBq0

fY'C(`'U \ ~0"DependOnService"=hex(7):4c,00,61,00,6e,00,6d,00,61,00,6e,00,57,00,6f,00,72,00,\

re*p:X9N3Z4XT(\J051Testing软件测试网7B%S?O_"p

 6b,00,73,00,74,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00

lM*D(A.g/c0\P0

&h-o6m^ n NUA'x0"DependOnGroup"=hex(7):00,0051Testing软件测试网Y}zjn\;SP%v's'^

VC N.Q5_%Q J.c0"ObjectName"="NT AUTHORITY\\LocalService"

r)DHW3o0

)` c/}(o&}}:Y(A!_[0"Descrīption"="消除笔记本的高频电流噪音"51Testing软件测试网 luCW a C.j0n`

!nq4qJl)x"`"a!B0 51Testing软件测试网"WK6?? [3De Q

9a-eS(N/|+t0[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Enum]51Testing软件测试网p:u8|Nw

o[|Ca+KEQ\ ^3?0"0"="Root\\LEGACY_ALERTER\\0000"51Testing软件测试网3K]'p,z;M |b!s

51Testing软件测试网&j/t8O"B CAY-_J0j

"Count"=dword:00000001

1K(F/[E'M J@S0

,U)r"V1d@ r{ Z`0"NextInstance"=dword:00000001

LqB3g7JG p051Testing软件测试网SSuc4u~i

 51Testing软件测试网8FXH.q!e E4f5x

51Testing软件测试网qmuX(z

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Parameters]

2W$o9~l+lI.[pRj.?&m6s0

zh$mv] Z0"AlertNames"=hex(7):00,00

"x1C hMY@L051Testing软件测试网!VzYQ:a$KXh |

"ServiceDll"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,\51Testing软件测试网)V-h7[~ H-t3W,wQ!T

Q]"g{7m4okV7[r0 00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,\51Testing软件测试网L`9za6L b5]1NE e M

51Testing软件测试网5z1h)Q'S r/H,O_

 64,00,65,00,6e,00,6f,00,69,00,73,00,65,00,2e,00,64,00,6c,00,6c,00,00,00

&?!uBE5c0

)}7?6D,M.N1H"PX?0 

.FR%k?3t(Z051Testing软件测试网]2j5i.gh V.L

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Security]51Testing软件测试网o1ir+W,]-A(u7n

+q&Sv3j.[%o0"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\

KC}(z[p0

&Z/vR)T p X&o0 00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\51Testing软件测试网?5G'?5Z e!^J

!{)z9Or5Jk#Z"f0 00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\51Testing软件测试网"H8LzWE%M`

[qvY\9E0 05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\

3?,\E,c$e'N.MN0

*SH-[+Y k0 20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\51Testing软件测试网.Vf5e8PN6`.DJOl}

51Testing软件测试网o zN`,gJ z

 00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\51Testing软件测试网2M8s0]+dLuU9TLr

51Testing软件测试网n.o2_+W?$c

 00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

$\-u7o2^ i"y-U3f'y _4c#O0

f3m0yY9lQ0 

u'K z&l"AL0

:X0?:Qg x@0[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost]51Testing软件测试网&`tmV \9BK!r

.S'A)P'Kf0"HTTPFilter"=hex(7):48,00,54,00,54,00,50,00,46,00,69,00,6c,00,74,00,65,00,72,\51Testing软件测试网#i?6c_I? RB

F xt:D_9E0 00,00,00,44,00,65,00,6e,00,6f,00,69,00,73,00,65,00,53,00,76,00,63,00,33,00,\51Testing软件测试网W9?U X:C3gL2X

51Testing软件测试网.zB*lh.v K N k

 31,00,00,00,00,0051Testing软件测试网&j~wv*L'CV6l,k

把它保存在denoise.reg中双击运行,然后重启机器,噪音问题就解决了。51Testing软件测试网}C2G+Lld:e

51Testing软件测试网p*h%G Izt(A

性能与不足

v8a7Dc1UC0

经过测试,该服务占用的内存约为370K,基本不占用CPU,对系统的负担是很小的。它消除噪音彻底,无论是否使用电池,以及系统是否从休眠中恢复,都不会再度产生噪音。

u;L LSrT$a%tD xW0

在运行该服务之后,少数情况下操作系统的事件配音的质量会受到影响,比如关机音乐会发生轻微爆音。但是对音乐播放器未造成能观察到的影响。

5~-VrMi/c0

参考文献

6SB ] Ra!Np7n|051Testing软件测试网@vznc \c

[1]IBM ThinkPad R52, T43 BIOS update.51Testing软件测试网C7tkO JLf

51Testing软件测试网2w;b#H1MzENU~

[2]Dell技术支持网站给出的消除噪音解决方案

Ie-Y2[b2J4T0

/y8][%gM"{#[[~0[3]Five Steps to Writing Windows Services in C

x#Tr rD f@}0

`5va dC9e0[4]创建SvcHost.exe调用的服务原理与实践

@w*p Qg051Testing软件测试网T'J'v Vk"e


\x].Lt(\~p;I0

.cS4qa i5V#IW0

点击此处下载可执行文件

e+c v&T[1O0

TAG:

 

评分:0

我来说两句

日历

« 2024-04-24  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 48395
  • 日志数: 69
  • 图片数: 4
  • 文件数: 2
  • 书签数: 1
  • 建立时间: 2006-12-27
  • 更新时间: 2010-02-25

RSS订阅

Open Toolbar