скачать книгу бесплатно
Метод ResumeSound возобновляет звук только тогда, если до этого воспроизводился циклический звук, как показано в следующем коде:
Public Sub ResumeSound()
If (Not Sound.Enabled) Then
Return
End If
If (Not loopSound Is Nothing) Then
PlaySound( _
loopSound, _
IntPtr.Zero, _
Flags.SND_ASYNC Or Flags.SND_MEMORY Or _
Flags.SND_LOOP)
End If
End Sub
Теперь от описания приступим к конкретной реализации.
А именно, для воспроизведения звуковых файлов, которые добавлены в проект по описанной ранее схеме, при помощи универсального (для многих приложений и игр) файла Sound.vb, в панели Solution Explorer выполняем правый щелчок по имени проекта и в контекстном меню выбираем Add, New Item. В панели Add New Item выделяем шаблон Code File, в окне Name записываем имя Sound.vb и щёлкаем кнопку Add.
В проект (и в панель Solution Explorer) добавляется этот файл, открывается пустое окно редактирования кода, в которое записываем следующий код.
Листинг 6.9. Файл Sound.vb.
Imports System.IO 'Для класса Stream.
Public Class Sound
'Переменная включает и выключает звук:
Public Shared Enabled As Boolean = True
'Свойство для приостановки и возобновления звука:
Public Property EnabledProperty() As Boolean
Get
Return Enabled
End Get
Set(ByVal value As Boolean)
Enabled = value
If (value) Then
ResumeSound()
Else
StopSound()
End If
End Set
End Property
'Массив для циклического звучания:
Private loopSound() As Byte = Nothing
'Массив для одноразового воспроизведения звука:
Private soundBytes() As Byte
'Флажки (константы) для управления методами
'операционной системы Windows CE, а именно,
'методом PlaySound из библиотеки CoreDll.dll
'при воспроизведении звукового файла:
Public Enum Flags
SND_ALIAS = &H10000
SND_ALIAS_ID = &H110000
SND_FILENAME = &H20000
SND_RESOURCE = &H40004
SND_SYNC = &H0
SND_ASYNC = &H1
SND_NODEFAULT = &H2
SND_MEMORY = &H4
SND_LOOP = &H8
SND_NOSTOP = &H10
SND_NOWAIT = &H2000
SND_VALIDFLAGS = &H17201F
SND_RESERVED = &HFF000000
SND_TYPE_MASK = &H170007
End Enum
'Из пространства имён System.Runtime.InteropServices
'импортируем библиотеку CoreDll.dll и
'объявляем функцию PlaySound этой библиотеки:
Private Declare Function PlaySound _
Lib "winmm.dll" Alias "PlaySound" (ByVal szSound() As Byte, _
ByVal hModule As IntPtr, ByVal dwFlags As Integer) As Integer
'Метод для считывания звукового файла:
Private Sub readStream(ByVal soundStream As Stream)
'Создаём массив soundBytes с элементами типа Byte
'и инициализируем размерность этого массива
'как длину звукового файла soundStream.Length:
soundBytes = New Byte(soundStream.Length) {}
'Из потока soundStream считываем звуковой файл
'в массив soundBytes:
soundStream.Read(soundBytes, 0, soundStream.Length)
End Sub
'Объявляем метод-конструктор класса Sound
'с параметром в виде потока soundStream класса Stream:
Public Sub New(ByVal soundStream As Stream)
'Вызываем метод для считывания звукового файла:
readStream(soundStream)
End Sub
'Объявляем метод-конструктор класса Sound
'с параметром в виде пути filename к звуковому файлу:
Public Sub New(ByVal filename As String)
Dim execAssem As System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim soundStream As Stream = _
execAssem.GetManifestResourceStream(filename)
If (soundStream Is Nothing) Then
System.Windows.Forms.MessageBox.Show( _
"Missing file : " + filename, "Audio Load")
Return
End If
readStream(soundStream)
End Sub
'Метод для разового воспроизведения звукового файла:
Public Sub Play()
loopSound = Nothing
If (Sound.Enabled) Then
PlaySound(soundBytes, IntPtr.Zero, _