DirectX SDK |
The IDirectSoundBuffer::Play method causes the sound buffer to play from the current position.
HRESULT Play( DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags );
If the method succeeds, the return value is DS_OK.
If the method fails, the return value may be one of the following error values:
DSERR_BUFFERLOST |
DSERR_HWUNAVAIL |
DSERR_INVALIDCALL |
DSERR_INVALIDPARAM |
DSERR_PRIOLEVELNEEDED |
This method will cause a secondary sound buffer to be mixed into the primary buffer and sent to the sound device. If this is the first buffer to play, it will implicitly create a primary buffer and start playing that buffer; the application need not explicitly direct the primary buffer to play.
If the buffer specified in the method is already playing, the call to the method will succeed and the buffer will continue to play. However, the flags defined in the most recent call supersede flags defined in previous calls.
Primary buffers must be played with the DSBPLAY_LOOPING flag set.
This method will cause primary sound buffers to start playing to the sound device. If the application is set to the DSSCL_WRITEPRIMARY cooperative level, this will cause the audio data in the primary buffer to be sent to the sound device. However, if the application is set to any other cooperative level, this method will ensure that the primary buffer is playing even when no secondary buffers are playing; in that case, silence will be played. This can reduce processing overhead when sounds are started and stopped in sequence, because the primary buffer will be playing continuously rather than stopping and starting between secondary buffers.
Voice allocation and voice management flags apply only to buffers created with the DSBCAPS_LOCDEFER flag set. If an IDirectSoundBuffer::Play is called with a voice allocation or voice management flag set on a buffer that was not created with the DSBCAPS_LOCDEFER flag set, the call will fail DSERR_INVALIDPARAM. DSBPLAY_TERMINATEBY_TIME and DSBPLAY_TERMINATEBY_DISTANCE cannot co-exist, but either may co-exist with DSBPLAY_TERMINATEBY_PRIORITY. In this case, the TIME or DISTANCE flag is used to determine which buffer should be terminated in the event of a priority tie.
Voice management flags summary. The following chart shows the behavior if the hardware has no free voices when a new Play is issued, assuming the buffer has been created with the DSBCAPS_LOCDEFER flag set:
DSBPLAY_LOCHARDWARE | No DSBPLAY_LOC flag | DSBPLAY_LOCSOFTWARE | |
---|---|---|---|
DSBPLAY_TERMINATEBY_TIME | Sound with least time left to play will be terminated and the new sound played on the released voice. | Sound with least time left to play will be terminated and the new sound played on the released voice. | New sound will be played in software. |
DSBPLAY_TERMINATEBY_DISTANCE | If any sounds currently playing in hardware are beyond their "MAX_DISTANCE" setting and have the DSBCAPS_MUTE3DATMAXDISTANCE flag set, one of them will be terminated and the new sound will play in hardware. Otherwise, the Play() call with fail. | If any sounds currently playing in hardware are beyond their "MAX_DISTANCE" setting and have the DSBCAPS_MUTE3DATMAXDISTANCE flag set, one of them will be terminated and the new sound will play in hardware. Otherwise, the new sound will play in software. | New sound will be played in software. |
DSBPLAY_TERMINATEBY_PRIORITY | If the new sound's priority is higher than or equal to that of any sound currently playing in hardware, one of the lowest-priority sounds will be terminated and the new sound will play in hardware. Otherwise, the Play() call with fail. | If the new sound's priority is higher than or equal to that of any sound currently playing in hardware, one of the lowest-priority sounds will be terminated and the new sound will play in hardware. Otherwise, the new sound will play in software. | New sound will be played in software. |
Note Before this method can be called on any sound buffer, the application should call the IDirectSound::SetCooperativeLevel method and specify a cooperative level, typically DSSCL_NORMAL. If IDirectSound::SetCooperativeLevel has not been called, the IDirectSoundBuffer::Play method returns with DS_OK, but no sound will be produced until IDirectSound::SetCooperativeLevel is called.
DSBPLAY_LOCHARDWARE and DSBPLAY_LOCSOFTWARE may not co-exist.
Windows NT/2000: Requires Windows NT 4.0 SP3 or later.
Windows 95/98: Requires Windows 95 or later. Available as a redistributable for Windows 95.
Header: Declared in dsound.h.
Import Library: Use dsound.lib.