import
pywintypes
import
struct
import
win32event
import
win32com.directsound.directsound as ds
import
os
WAV_HEADER_SIZE
=
struct.calcsize(
'<4sl4s4slhhllhh4sl'
)
def
wav_header_unpack(data):
(riff, riffsize, wave, fmt, fmtsize,
format
, nchannels, samplespersecond, \
datarate, blockalign, bitspersample, data, datalength)
=
struct.unpack(
'<4sl4s4slhhllhh4sl'
, data)
if
riff !
=
b
'RIFF'
or
fmtsize !
=
16
or
fmt !
=
b
'fmt '
or
data !
=
b
'data'
:
raise
ValueError
wfx
=
pywintypes.WAVEFORMATEX()
wfx.wFormatTag
=
format
wfx.nChannels
=
nchannels
wfx.nSamplesPerSec
=
samplespersecond
wfx.nAvgBytesPerSec
=
datarate
wfx.nBlockAlign
=
blockalign
wfx.wBitsPerSample
=
bitspersample
return
wfx, datalength
sound_file
=
"音效-足球观众的欢呼声.wav"
fname
=
os.path.join(os.path.dirname(__file__), sound_file)
f
=
open
(fname,
'rb'
)
hdr
=
f.read(WAV_HEADER_SIZE)
wfx, size
=
wav_header_unpack(hdr)
d
=
ds.DirectSoundCreate(
None
,
None
)
d.SetCooperativeLevel(
None
, ds.DSSCL_PRIORITY)
sdesc
=
ds.DSBUFFERDESC()
sdesc.dwFlags
=
ds.DSBCAPS_STICKYFOCUS | ds.DSBCAPS_CTRLPOSITIONNOTIFY
sdesc.dwBufferBytes
=
size
sdesc.lpwfxFormat
=
wfx
buffer
=
d.CreateSoundBuffer(sdesc,
None
)
event
=
win32event.CreateEvent(
None
,
0
,
0
,
None
)
notify
=
buffer
.QueryInterface(ds.IID_IDirectSoundNotify)
notify.SetNotificationPositions((ds.DSBPN_OFFSETSTOP, event))
buffer
.Update(
0
, f.read(size))
buffer
.Play(
0
)
win32event.WaitForSingleObject(event,
-
1
)