Basic DirectSound question

  • Thread starter Thread starter Scott H
  • Start date Start date
S

Scott H

I'm just starting to learn directaudio, and want to start off not with
playing a WAV, thats all too easy, I want to generate the waveform, so
to start off I'm trying to generate white noise, using the code below,
but its erroring with a "Index out of range" Exception on the line of
code inditcated:


Private DSdev As New Device
Private DSbuffer As SecondaryBuffer
Private IOstream As System.IO.MemoryStream


Now some code to make it happen:


DSdev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)
IOstream = New System.IO.MemoryStream(22000)

Dim x As Integer
For x = 1 To 20000
IOstream.WriteByte(Int(Rnd() * 254))
Next

DSbuffer = New SecondaryBuffer(IOstream, DSdev) '<<<< ERROR

If Not DSbuffer Is Nothing Then DSbuffer.Play(0,
BufferPlayFlags.Default)
 
Scott H said:
I'm just starting to learn directaudio, and want to start off not
with playing a WAV, thats all too easy, I want to generate the
waveform, so to start off I'm trying to generate white noise, using
the code below, but its erroring with a "Index out of range"
Exception on the line of code inditcated:


Private DSdev As New Device
Private DSbuffer As SecondaryBuffer
Private IOstream As System.IO.MemoryStream


Now some code to make it happen:


DSdev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)
IOstream = New System.IO.MemoryStream(22000)

Dim x As Integer
For x = 1 To 20000
IOstream.WriteByte(Int(Rnd() * 254))
Next

IOstream.position = 0
DSbuffer = New SecondaryBuffer(IOstream, DSdev) '<<<< ERROR

This solves the index out of range exception. Despite, I get another
exception, here, that I can not solve with a lot debugging.

You should try the MDX group @
microsoft.public.win32.programmer.directx.managed


Armin
 
Success!
It seems alot of people get stuck there, I found a C# example,
converted it to VB and got lots of errors, so just "jigged" around
with it a bit, and finally got it going, playing 1 second of white
noise!!!

Here's the code, for Armin and anyone else who wants to do this.

'DEFINITIONS:
Private DSdev As New Device
Private DSbuffer As SecondaryBuffer
Private DSdes As BufferDescription
Private DSformat As WaveFormat

'CODE IN SOME SUB/FUNCTION
DSdev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal)

'define the wave format
DSformat = New WaveFormat()
DSformat.BitsPerSample = 8
DSformat.Channels = 1
DSformat.BlockAlign = 1
DSformat.FormatTag = WaveFormatTag.Pcm
DSformat.SamplesPerSecond = 8000
DSformat.AverageBytesPerSecond = DSformat.SamplesPerSecond *
DSformat.BlockAlign

'buffer description
DSdes = New BufferDescription(DSformat)
DSdes.BufferBytes = 3 * DSformat.AverageBytesPerSecond

'create the buffer
DSbuffer = New
Microsoft.DirectX.DirectSound.SecondaryBuffer(DSdes, DSdev)

'generate ramdom data (white noise)
Dim rawsamples(22050) As Byte
Dim rnd1 = New System.Random()

Dim i As Integer
For i = 0 To 22050
rawsamples(i) = rnd1.Next(255)
Next i

' load audio samples to secondary buffer
DSbuffer.Write(0, rawsamples, LockFlag.EntireBuffer)

'play audio buffer
DSbuffer.Play(0, BufferPlayFlags.Default)
 
Back
Top