Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
90 lines
4.1 KiB
Plaintext
90 lines
4.1 KiB
Plaintext
//-----------------------------------------------------------------------------
|
|
//
|
|
// Sample Name: StreamData Sample
|
|
//
|
|
// Copyright (c) 1999-2001 Microsoft Corporation. All rights reserved.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
Description
|
|
===========
|
|
The StreamData sample shows how to stream a wave file through a DirectSound
|
|
secondary buffer. It is similar to the PlaySound sample, but adds support
|
|
for streaming.
|
|
|
|
Path
|
|
====
|
|
Source: DXSDK\Samples\Multimedia\DSound\StreamData
|
|
|
|
Executable: DXSDK\Samples\Multimedia\DSound\Bin
|
|
|
|
User's Guide
|
|
============
|
|
Load a wave file by clicking Sound File. Select Loop Sound if you want it
|
|
to play repeatedly. Click Play.
|
|
|
|
Programming Notes
|
|
=================
|
|
For details on how to setup a non-streaming DirectSound buffer, see the
|
|
PlaySound sample.
|
|
|
|
The basic tasks to stream data from a wav file to a DirectSound buffer are
|
|
as follows:
|
|
|
|
* Set up DirectSound:
|
|
1. Call DirectSoundCreate to create a IDirectSound object
|
|
2. Call IDirectSound::SetCooperativeLevel to set the cooperative level.
|
|
3. Set the primary buffer format. This sample calls
|
|
DSUtil_SetPrimaryBufferFormat() to do just this.
|
|
|
|
* Create a DirectSound buffer and set up the notifications:
|
|
1. Read the wav file to get the wav file size, and the wav format
|
|
in the format a WAVEFORMATEX structure.
|
|
2. Choose a DirectSound buffer size. This is the amount of data that
|
|
DirectSound stores at once. You re-fill this buffer as sound plays
|
|
from this buffer. This is best for large sounds files that are not
|
|
possible to load all at once. For this sample, the buffer size is
|
|
~3 seconds of data.
|
|
3. Create a DirectSound buffer using the buffer size, and the wav file's
|
|
format. Also pass in DSBCAPS_CTRLPOSITIONNOTIFY flag. This allows the
|
|
buffer to send notification events to tell us whenever sound has finished
|
|
playing. However, using this flags limits the buffer to software only,
|
|
since hardware can not signal position notifications.
|
|
4. Set up the notifications on the buffer by calling
|
|
IDirectSoundBuffer::SetNotificationPositions. See InitDSoundNotification()
|
|
for an example of how this is done. When DirectSound plays past a
|
|
notification position it signals an Win32 event. When this event is signaled,
|
|
it is safe to fill that segment of data in the buffer with a new piece of
|
|
sound.
|
|
|
|
* Play the DirectSound buffer:
|
|
1. Call IDirectSoundBuffer::Restore on the buffer if the buffer was lost.
|
|
2. Next, fill the DirectSound buffer will the maximum amount of sound data.
|
|
Since all the sound can not fit into this buffer will be filled with new
|
|
sound data as this sound plays.
|
|
3. Call IDirectSoundBuffer::Play with the DSBPLAY_LOOPING flag set to
|
|
start the buffer playing. The looping flag needs to be set since the
|
|
buffer will need to continue playing after the end of the buffer is
|
|
reached since typically more sound needs to be played.
|
|
|
|
* Check to see if a notification is signaled:
|
|
1. Typically in the message pump check to see if the event was signaled.
|
|
The event tells us that a segment of data has been played so this
|
|
piece need to be filled. MsgWaitForMultipleObjects() works well as
|
|
the message pump for this purpose.
|
|
2. If the event has been signaled, then lock the section of the buffer
|
|
than has just been played and fill it with the next segment of wav
|
|
data. See HandleNotification() for how this works.
|
|
|
|
* When the entire sound has played:
|
|
When handling the event notification, keep track of how much data has
|
|
been put in the buffer. When the entire wav file has been put into the
|
|
buffer, and after DirectSound has played it all it is necessary to manually
|
|
stop the buffer since the buffer will continuously loop otherwise.
|
|
|
|
* Free DirectSound:
|
|
Simply call Release() on all the DirectSound objects that were created.
|
|
|
|
|