123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
Imports IrrKlang
 | 
						|
 | 
						|
Module Module1
 | 
						|
 | 
						|
    Sub Main()
 | 
						|
 | 
						|
        ' start up the engine
 | 
						|
        Dim engine As New ISoundEngine
 | 
						|
 | 
						|
        ' Now play some sound stream as music in 3d space, looped.
 | 
						|
        ' We play it at position (0,0,0) in 3d space
 | 
						|
 | 
						|
        Dim music As ISound = engine.Play3D("../../media/ophelia.mp3", 0, 0, 0, True)
 | 
						|
 | 
						|
        ' the following step isn't necessary, but to adjust the distance where
 | 
						|
        ' the 3D sound can be heard, we set some nicer minimum distance
 | 
						|
        ' (the default min distance is 1, for a small object). The minimum
 | 
						|
        ' distance simply is the distance in which the sound gets played
 | 
						|
        ' at maximum volume.
 | 
						|
 | 
						|
        If Not (music Is Nothing) Then
 | 
						|
            music.MinDistance = 5.0F
 | 
						|
        End If
 | 
						|
 | 
						|
        ' Print some help text and start the display loop
 | 
						|
 | 
						|
        Console.Out.Write(ControlChars.CrLf & "Playing streamed sound in 3D.")
 | 
						|
        Console.Out.WriteLine(ControlChars.CrLf & "Press ESCAPE to quit, any other key to play sound at random position." & ControlChars.CrLf)
 | 
						|
 | 
						|
        Console.Out.WriteLine("+ = Listener position")
 | 
						|
        Console.Out.WriteLine("o = Playing sound")
 | 
						|
 | 
						|
        Dim rand As Random = New Random
 | 
						|
        Dim radius As Single = 5
 | 
						|
        Dim posOnCircle As Single = 5
 | 
						|
 | 
						|
        While (True) '  endless loop until user exits
 | 
						|
 | 
						|
            ' Each step we calculate the position of the 3D music.
 | 
						|
            ' For this example, we let the
 | 
						|
            ' music position rotate on a circle:
 | 
						|
 | 
						|
            posOnCircle += 0.0399999991F
 | 
						|
            Dim pos3D As Vector3D = New Vector3D(radius * Math.Cos(posOnCircle), 0, _
 | 
						|
                         radius * Math.Sin(posOnCircle * 0.5F))
 | 
						|
 | 
						|
            ' After we know the positions, we need to let irrKlang know about the
 | 
						|
            ' listener position (always position (0,0,0), facing forward in this example)
 | 
						|
            ' and let irrKlang know about our calculated 3D music position
 | 
						|
 | 
						|
            engine.SetListenerPosition(0, 0, 0, 0, 0, 1)
 | 
						|
 | 
						|
            If Not (music Is Nothing) Then
 | 
						|
                music.Position = pos3D
 | 
						|
            End If
 | 
						|
 | 
						|
            ' Now print the position of the sound in a nice way to the console
 | 
						|
            ' and also print the play position
 | 
						|
 | 
						|
            Dim stringForDisplay As String = "          +         "
 | 
						|
            Dim charpos As Integer = Math.Floor((CSng(pos3D.X + radius) / radius * 10.0F))
 | 
						|
            If (charpos >= 0 And charpos < 20) Then
 | 
						|
                stringForDisplay = stringForDisplay.Remove(charpos, 1)
 | 
						|
                stringForDisplay = stringForDisplay.Insert(charpos, "o")
 | 
						|
            End If
 | 
						|
 | 
						|
            Dim playPos As Integer
 | 
						|
            If Not (music Is Nothing) Then
 | 
						|
                playPos = Integer.Parse(music.PlayPosition.ToString) ' how to convert UInt32 to Integer in visual basic?
 | 
						|
            End If
 | 
						|
 | 
						|
            Dim output As String = ControlChars.Cr & String.Format("x:({0})   3dpos: {1:f} {2:f} {3:f}, playpos:{4}:{5:00}    ", _
 | 
						|
             stringForDisplay, pos3D.X, pos3D.Y, pos3D.Z, _
 | 
						|
             playPos \ 60000, (playPos Mod 60000) / 1000)
 | 
						|
 | 
						|
            Console.Write(output)
 | 
						|
 | 
						|
            System.Threading.Thread.Sleep(100)
 | 
						|
 | 
						|
            ' Handle user input: Every time the user presses a key in the console,
 | 
						|
            ' play a random sound or exit the application if he pressed ESCAPE.
 | 
						|
 | 
						|
            If _kbhit() <> 0 Then
 | 
						|
                Dim key As Integer = _getch()
 | 
						|
 | 
						|
                If (key = 27) Then
 | 
						|
                    Return ' user pressed ESCAPE key
 | 
						|
                Else
 | 
						|
 | 
						|
                    ' Play random sound at some random position.
 | 
						|
 | 
						|
                    Dim pos As Vector3D = New Vector3D((rand.NextDouble() Mod radius * 2.0F) - radius, 0, 0)
 | 
						|
 | 
						|
                    Dim filename As String
 | 
						|
 | 
						|
                    If (rand.Next() Mod 2 <> 0) Then
 | 
						|
                        filename = "../../media/bell.wav"
 | 
						|
                    Else
 | 
						|
                        filename = "../../media/explosion.wav"
 | 
						|
                    End If
 | 
						|
 | 
						|
                    engine.Play3D(filename, pos.X, pos.Y, pos.Z)
 | 
						|
 | 
						|
                    Console.WriteLine(ControlChars.CrLf & "playing {0} at {1:f} {2:f} {3:f}", _
 | 
						|
                        filename, pos.X, pos.Y, pos.Z)
 | 
						|
                End If
 | 
						|
 | 
						|
            End If
 | 
						|
 | 
						|
        End While
 | 
						|
 | 
						|
    End Sub
 | 
						|
 | 
						|
    ' some simple function for reading keys from the console
 | 
						|
    <System.Runtime.InteropServices.DllImport("msvcrt")> _
 | 
						|
    Public Function _getch() As Integer
 | 
						|
    End Function
 | 
						|
    <System.Runtime.InteropServices.DllImport("msvcrt")> _
 | 
						|
    Public Function _kbhit() As Integer
 | 
						|
    End Function
 | 
						|
 | 
						|
End Module
 |