MIDI-звук в VB.NET: после приостановки и возобновления звучит иначе - PullRequest
1 голос
/ 19 ноября 2011

Я пытаюсь воспроизвести MIDI-файл в моем VB.NET (VB 2010 Express), и все хорошо работает с кодом из этот другой вопрос здесь, о переполнении стека , который я перевел с C на VB.

Однако мне также нужно PAUSE, пока этот код предназначен только для открытия и остановки. Я отредактировал код так:

Imports System.Runtime.InteropServices
Imports System.IO
''' <summary>
''' MCIPlayer is based off code by Slain.
''' Found here: http://www.sadeveloper.net/Articles_View.aspx?articleID=212
''' </summary>
Public Class MCIPlayer
    Private Shared ReadOnly sAlias As String = "TeaTimerAudio"

    <DllImport("winmm.dll")> _
    Private Shared Function mciSendString(ByVal strCommand As String, ByVal strReturn As StringBuilder, ByVal iReturnLength As Integer, ByVal hwndCallback As IntPtr) As Long
    End Function

    Public Shared Sub Open(ByVal sFileName As String)
        If _Status() <> "" Then
            _Close()
        End If
        Dim sCommand As String = "open """ & sFileName & """ alias " & sAlias
        mciSendString(sCommand, Nothing, 0, IntPtr.Zero)
    End Sub

    Public Shared Sub Close()
        Dim sCommand As String = "close " & sAlias
        mciSendString(sCommand, Nothing, 0, IntPtr.Zero)
    End Sub

    Public Shared Sub Pause()
        Dim sCommand As String = "pause " & sAlias
        mciSendString(sCommand, Nothing, 0, IntPtr.Zero)
    End Sub

    Public Shared Sub Play()
        Dim sCommand As String = "play " & sAlias
        mciSendString(sCommand, Nothing, 0, IntPtr.Zero)
    End Sub

    Public Shared Function Status() As String
        Dim sBuffer As New StringBuilder(128)
        mciSendString("status " & sAlias & " mode", sBuffer, sBuffer.Capacity, IntPtr.Zero)
        Return sBuffer.ToString()
    End Function
End Class

И я называю это так:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MCIPlayer.Open("C:\Users\User\Desktop\aqua-roses_are_red.mid")
End Sub

Private Sub PlayButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayButton.Click
    MCIPlayer.Play()
End Sub

Private Sub PauseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PauseButton.Click
    MCIPlayer.Pause()
End Sub

Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopButton.Click
    MCIPlayer.Close()
End Sub

Проблема в том, что, по какой-то причине, если я нажимаю кнопку воспроизведения, затем приостанавливаю, а затем снова запускаю, файл фактически возобновляет воспроизведение с того места, где он был оставлен, но инструменты совершенно другие. Мелодия переключается обратно на пианино по умолчанию, а перед нажатием паузы звучал совершенно другой звук.

Можете ли вы помочь мне в этом?

Я нахожусь на Win7x64

Большое спасибо! Лучший

1 Ответ

0 голосов
/ 20 ноября 2011

ОК, я понял, как это сделать. Вот код, слабо вдохновленный ссылкой на freebasic.net, которую я упомянул в комментарии выше, но намного проще:

Public Shared Sub ResumeAfterPause()
    MsgBox(CLng(_Status()))   'Just to make sure the status is the position, see below
    Dim sCommand As String = "play " & sAlias & " from " & CLng(_Status())
    mciSendString(sCommand, Nothing, 0, IntPtr.Zero)
End Sub

И процедура статуса изменяется следующим образом:

Public Shared Function _Status() As String
    Dim sBuffer As New StringBuilder(128)
    mciSendString("status " & sAlias & " position", sBuffer, sBuffer.Capacity, IntPtr.Zero)
    Return sBuffer.ToString()
End Function

Полагаю, что когда песня воспроизводится с самого начала, плеер читает информацию об инструменте. Когда он запускается из другой позиции, вы должны сообщить драйверу устройства, что он запускается из другой позиции, чтобы он мог восстановить предыдущие настройки прибора.

В любом случае, все хорошо, что хорошо кончается (хотя это еще не конец ... Когда мое приложение готово, мне нужно протестировать его и на других платформах и посмотреть, работает ли оно так же).

...