Mehrkanal-Sound oder Surround-Sound

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Mehrkanal-Sound oder Surround-Sound

    Ich würde gerne mehrere Sound Dateien gleichzeitig abspielen (das klappt schon), aber diese über ein Mehrkanal oder Surround-Sound System an unterschiedlichen Lautsprechern wiedergeben.

    Hat jemand eine Idee?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi, erst einmal vielen Danke für die richtige Richtung.
    Ich habe mittels BASS (BassMix) die Sound Ausgabe über das 7.1 System geschafft.

    Er spielt jetzt den Soundfile auf dem Speaker den ich in der .INI Datei angebe.

    Leider spielt er nur auf den Frontspeakern richtig. Immer wenn ich die Routine aufrufe und ich habe z.B CENTER oder LFE eingetragen. Spielt er den Soundfile nur einmal ab. Egal wie oft ich die Routine starte. Bei FRONT oder FRONTRIGHT stoppt er das abspielen und started erneut. Im Status bringt er dann auch "Speakers=2, MinRate=0, MaxRate=0, DX=9, EAX=False" anstatt "Speaker=8.."

    Was kann ich ändern?

    Hier der code:

    VB.NET-Quellcode

    1. Private Sub BMain1()
    2. Dim filePath1 As String
    3. ' aktiveUebung comes from .ini file
    4. filePath1 = System.IO.Path.Combine(My.Application.Info.DirectoryPath, aktiveUebung01)
    5. Dim infoTXTa As String = ""
    6. Bass.BASS_SetDevice(BassCanalCount)
    7. Bass.BASS_Init(BassCanalCount, 44100, BASSInit.BASS_DEVICE_MONO, IntPtr.Zero)
    8. ' stop sound play and clears stream if started again
    9. If stream1 <> 0 Then
    10. Bass.BASS_StreamFree(stream1)
    11. End If
    12. ' the source stream
    13. stream1 = Bass.BASS_StreamCreateFile(filePath1, 0, 0, BASSFlag.BASS_STREAM_DECODE)
    14. ' create a 8-channel mixer stream
    15. Dim i As BASS_CHANNELINFO = Bass.BASS_ChannelGetInfo(stream1)
    16. Dim mixer1 As Integer = BassMix.BASS_Mixer_StreamCreate(i.freq, 8, BASSFlag.BASS_DEFAULT)
    17. ' add the source stream to the mixer with the matrix option using only mono files
    18. BassMix.BASS_Mixer_StreamAddChannel(mixer1, stream1, BASSFlag.BASS_MIXER_MATRIX)
    19. Dim matrix1(,) As Single = { ' stereo to quad matrix
    20. {1}, ' left front out
    21. {0}, ' right front out
    22. {0}, ' center out
    23. {0}, ' LFE out
    24. {0}, ' left rear out
    25. {0}, ' right rear out
    26. {0}, ' left rear center out
    27. {0} ' right rear center out
    28. }
    29. ' create a stream channel from a file
    30. ' aktiveUebungA comes from .ini file
    31. Select Case aktiveUebungA
    32. ' define a mixing matrix for the source stream
    33. Case "FRONT"
    34. matrix1 = {{1}, {1}, {0}, {0}, {0}, {0}, {0}, {0}}
    35. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_FRONT)
    36. Case "FRONTLEFT"
    37. matrix1 = {{1}, {0}, {0}, {0}, {0}, {0}, {0}, {0}}
    38. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_FRONTLEFT)
    39. Case "FRONTRIGHT"
    40. matrix1 = {{0}, {1}, {0}, {0}, {0}, {0}, {0}, {0}}
    41. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_FRONTRIGHT)
    42. Case "REAR"
    43. matrix1 = {{0}, {0}, {0}, {0}, {1}, {1}, {0}, {0}}
    44. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_REAR)
    45. Case "REARLEFT"
    46. matrix1 = {{0}, {0}, {0}, {0}, {1}, {0}, {0}, {0}}
    47. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_REARLEFT)
    48. Case "REARRIGHT"
    49. matrix1 = {{0}, {0}, {0}, {0}, {0}, {1}, {0}, {0}}
    50. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_REARRIGHT)
    51. Case "CENTER"
    52. matrix1 = {{0}, {0}, {1}, {0}, {0}, {0}, {0}, {0}}
    53. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_CENTER)
    54. Case "CENLFE"
    55. matrix1 = {{0}, {0}, {1}, {1}, {0}, {0}, {0}, {0}}
    56. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_CENLFE)
    57. Case "LFE"
    58. matrix1 = {{0}, {0}, {0}, {1}, {0}, {0}, {0}, {0}}
    59. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_LFE)
    60. Case "REAR2LEFT"
    61. matrix1 = {{0}, {0}, {0}, {0}, {0}, {0}, {1}, {0}}
    62. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_REAR2LEFT)
    63. Case "REAR2RIGHT"
    64. matrix1 = {{0}, {0}, {0}, {0}, {0}, {0}, {0}, {1}}
    65. 'stream1 = Bass.BASS_StreamCreateFile(filePath1, 0L, 0L, BASSFlag.BASS_SPEAKER_REAR2RIGHT)
    66. End Select
    67. BassCanal01 = BassCanalCount
    68. BassMix.BASS_Mixer_ChannelSetMatrix(stream1, matrix1)
    69. ' and play it
    70. Bass.BASS_ChannelPlay(mixer1, False)
    71. Dim infoa As New BASS_INFO()
    72. ' this displays info like:
    73. ' "Speakers=8, MinRate=0, MaxRate=0, DX=9, EAX=False"
    74. ' or
    75. ' "Speakers=2, MinRate=0, MaxRate=0, DX=9, EAX=False"
    76. If Bass.BASS_GetInfo(infoa) Then
    77. Label4.Text = infoa.ToString()
    78. End If
    79. Dim info1 As New BASS_CHANNELINFO()
    80. Bass.BASS_ChannelGetInfo(stream1, info1)
    81. infoTXTa = info1.ToString()
    82. ' this displays info like:
    83. ' "WAV, 44100Hz, Mono, 16bit"
    84. Dim n As Integer = 0
    85. Dim Bassinfo1 As New BASS_DEVICEINFO()
    86. Dim infoTXTaa As String = ""
    87. ' this displays info like:
    88. ' Digital Output (5- USB MultiChannel Audio Device)
    89. ' or
    90. ' Speakers/Headphones (Realtek(R) Audio)
    91. While (Bass.BASS_GetDeviceInfo(n, Bassinfo1))
    92. infoTXTaa = Bassinfo1.ToString()
    93. n += 1
    94. End While
    95. If stream1 <> 0 Then
    96. BassCanalCount = BassCanalCount + 1
    97. ' this displays info like:
    98. ' 1 (counts up) SoundFile.wav FRONTLEFT (Speaker)
    99. Label22.Text = " " & BassCanal01 & " " & aktiveUebung01 & " " & aktiveUebungA & " " & infoTXTa & " " & infoTXTaa
    100. ' 1 SoundFile.wav FRONTLEFT WAV, 44100Hz, Mono, 16bit Digital Output (5- USB MultiChannel Audio Device)
    101. ' or
    102. ' 3 SoundFile.wav CENTER WAV, 44100Hz, Mono, 16bit Digital Output (5- USB MultiChannel Audio Device)
    103. Else
    104. ' error creating the stream
    105. BassCanalTXT01 = " Bass Error " & Bass.BASS_ErrorGetCode
    106. ' Error Text
    107. Label22.Text = " " & BassCanal01 & " " & aktiveUebung01 & " " & aktiveUebungA & " " & BassCanalTXT01 & " " & infoTXTa & " " & infoTXTaa
    108. BassCanalTXT01 = ""
    109. End If
    110. End Sub


    Viele Zeilen sind nur um die Hardware zu ermitteln oder um anzuzeigen was gerade läuft, um den Fehler zu finden.

    Gruß
    Willi
    Yo,

    ich werde morgen mal schauen wie ich das gemacht hab, habe es nicht mehr so richtig im Kopf.

    Was ist BassCanalCount?
    Bass.BASS_SetDevice(BassCanalCount)solltest du auch erst callen nachdem du Bass.Init gecallt hast.

    Hier kann auch was falsch sein, ich denke du solltest BASS_DEVICE_SPEAKER oder BASS_DEVICE_CPSPEAKERS anstatt mono nehmen.
    Bass.BASS_Init(BassCanalCount, 44100, BASSInit.BASS_DEVICE_MONO, IntPtr.Zero)

    Aber wie gesagt, ich krame morgen eine projektmappe aus und schaue noch mal nach, wie ich das gemacht habe.

    Kleiner Tipp, ich sehe in deiner "Matrix" nur 0 und 1. Du kannst auch Singles nehmen)passend zum DatenTyp der Matrix, 0.5f entspricht halbe maximale Lautstärke. So hab ich die Lautstärke für jeden einzelnen Lautsprecher eingestellt.

    Ist die Audiodatei mit nur einer Tonspur?
    Hallo Takafusa,

    BasCanalCount ist ein Zähler der jedes mal bei Aufruf der Prozedur hoch zählt. Denke das es immer ein neuer Canal sein muss.

    Bass.BASS_SetDevice(BassCanalCount)solltest du auch erst callen nachdem du Bass.Init gecallt hast. OK, werd ich testen

    Bass.BASS_Init(BassCanalCount, 44100, BASSInit.BASS_DEVICE_MONO, IntPtr.Zero) hier habe ich schon viel rum experimentiert

    Ich verwende ausschließlich Mono Files mit einer Spur.

    wäre cool wenn du da was findest.


    Edit:
    Die Reihenfolge hat nichts geändert
    Egal ob ich BASSInit.BASS_DEVICE_MONO, BASSInit.BASS_DEVICE_SPEAKER oder BASSInit.BASS_DEVICE_CPSPEAKERS ändert leider auch nichts

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Willi_P“ ()

    Nabend,

    ich denke ich werde einfach ein kleines Projekt aufsetzen. Ich habe noch alten Code, daraus nehm ich einfach den für das Thema relevanten Code, passe das so an, das eine Audiodatei mit 1 Spur auf jedem Kanal ausgegeben werden kann.

    Wenn die Soundkarte auf der das ausgegeben werden soll, die Standart-Ausgabe vom System ist, dann brauchst du nicht alle Devices initialisieren, einfach mit -1 anstatt den Wert von BassCanalCount initialisieren.

    Bass.BASS_Init(-1, 44100, ...
    Daaaaaaaaaaankeeeeee

    Es läuft.

    Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero)
    Bass.BASS_SetDevice(-1)

    War die Lösung

    Jetzt kann ich alle Tasten wild durcheinander drücken und der jeweilige Sound kommt am richtigen Lautsprecher raus
    und wird gestoppt und fängt von vorne an wenn ich die Taste erneut drücke.
    Mir fällt gerade noch etwas auf,

    VB.NET-Quellcode

    1. Private Sub BMain1()

    dort callst du Bass_Init, wenn du die Sub mehrfach callst geht's ab 2. Init beim bereits initialisierten Devices schief. In diesem Fall weniger tragisch, da du den Rückgabewert ignorierst. Es reicht einmal im Form_Load das/die Device(s) zu initialisieren.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Lautstärkeanpassung ist gut. Zumal es auf der Modellbahnanlage ja eher Hintergrundgeräusche sein sollen.

    Takafusa schrieb:

    Kleiner Tipp, ich sehe in deiner "Matrix" nur 0 und 1. Du kannst auch Singles nehmen)passend zum DatenTyp der Matrix, 0.5f entspricht halbe maximale Lautstärke. So hab ich die Lautstärke für jeden einzelnen Lautsprecher eingestellt.


    0.5F und 0.25F hab ich mal getestet. Das geht. Wie sind die möglichen Werte hier und wo könnte ich das nachlesen?
    Die hast du ja in der Matrix, darüber kannst du drauf zugreifen, die range ist von 0.0 bis 1.0.
    Ich habe eine Trackbar genommen, Min 0 Max 100, beim Value_Changed der Trackbar die matrix anpassen, den Wert nicht vergessen durch 100 zu teilen..