Другие языки программирования и технологии

Как сделать многопоточное воспроизведение звука в c#

только пожалуйста не отвечайте погугли итд)я ищу уже давно но в голове больше мыслей не прибавилось) получается воспроизвести токо 1 звук сразу,либо нажимая какую то вторую клавишу на которую повешен звук воспроизведение начинается тольк опосле окончания проигрывания первого
Alexander Kim
Alexander Kim
898
Я думаю что не нужно никаких потоков. Звуковая подсистема (MCI) сама обеспечивает одновременное воспроизведение звуковых файлов, причем разных форматов (зависит от установленных в системе кодеков) .
Достаточно вызвать пару API функций.
Я синтаксис С# не знаю, поэтому напишу в VB.NET

Public Class Form1

'*** Декларируем API функции ***
' Воспроизведение звука и музыки
Private Declare Function mciSendString Lib "winmm.dll" _
Alias "mciSendStringA" (ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, ByVal uRetrunLength _
As Long, ByVal hwndCallback As Long) As Long
' Преобразование длинного имени файла в короткое (8.3) имя.
Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _
ByVal cchBuffer As Integer) As Int32

' Загрузка формы
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Задаем каталог (звуки, курсор, музыка и проч... )
Dim Directory As String = Application.StartupPath & "\Sound\"

'Грузим звуки и музыку в MCI
FileName = ShortFilePath(Directory & "1.mid") ' фоновая музыка
mciSendString("open " & FileName & " alias Фон", "", 0, 0)
FileName = ShortFilePath(Directory & "CLICK.WAV") ' перзарядка патронов
mciSendString("open " & FileName & " alias Патроны", "", 0, 0)
FileName = ShortFilePath(Directory & "TimerTick.wav") ' нет патронов
mciSendString("open " & FileName & " alias Клик", "", 0, 0)
FileName = ShortFilePath(Directory & "exp1.wav") ' выстрел #1
mciSendString("open " & FileName & " alias Выстрел1", "", 0, 0)

' Воспроизводим фон
mciSendString("play Фон", "", 0, 0)
End Sub

' Перезарядка патронов
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

' Воспроизводим звук перезарядки патронов
mciSendString("play Патроны from 0", "", 0, 0)
End Sub

' Звук выстрела
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

' Воспроизводим звук выстрела
mciSendString("play Выстрел1 from 0", "", 0, 0)
End Sub

'* Функция преобразования пути к файлу (длинный в короткий)
Private Function ShortFilePath(ByVal strFilePath As String) As String
Dim ShortFileName As String = Space(256) ' буфер для короткого имени
Dim Result As Int32 = GetShortPathName(strFilePath, ShortFileName, Len(ShortFileName))
ShortFilePath = Microsoft.VisualBasic.Left(ShortFileName, Result)
End Function

End Class

По поводу вопроса: "Где скачать несколько октав звуков интсрументов (гитара, пианино, саксафон итд)? "
Аналогично, API-функцией можно извлекать из MCI прописанные в звуковой карте сэмплы.
Всего 256 нот из 128 инструментов, с разной динамикой (атака звука и послезвучание) . Стандарт GENERAL MIDI.
Kz Тlеk
89 376
Лучший ответ
Игорь Анисимов Вроде на C# Спрашивают!
мне приходит на ум одно решение) потоки.
http://www.rsdn.ru/article/dotnet/CSThreading1.xml

и вот еще нашел
http://forum.ixbt.com/topic.cgi?id=26:37878
Alexander Kim спасибо)щас почитаю)я впринципи через thread и делаю ,но видимо не так делаю
Alexander Kim вторым методом пробовал дня два назад чето особо работать он не захотел)
Сергей Гусаров ну в потоке должн ополучиться) первую ссылку почитай, там вродь нормально описано)