CSCore - Highperformance Audiobibliothek

    • Release
    • Open Source

    Es gibt 589 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

      Das ist keine NullReference Exception und ist absolut gewollt. Das ist eine ArgumentNullException, was eben genau die NullReferenceException verhindert. Ich löse die ArgumentNullException aus, da es sich um einen Fehler deinerseits handelt.

      Edit: grad gesehen, du hattest doch ArgumentNullException geschrieben, verlesen sry. Der Rest trifft trotzdem zu.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Ja, so siehts aus. Ich habe das ganze mal nur mit "theme" statt "theme.mp3" versucht, dabei kam folgendes heraus:

      Quellcode

      1. Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in mscorlib.dll aufgetreten.
      2. Zusätzliche Informationen: Die Ressource "theme" ist kein Datenstrom. Rufen Sie GetObject auf.


      Aber GetObject bringt mir ja nichts, da bin ich ja wieder bei der Datei als solches und habe keine Stream.
      Liebe Grüße
      sothere
      Nein, die Datei heißt theme.mp3 und die Resource dann halt theme . Aber wie gesagt, wenn ich nur theme verwenden, bekomme ich oben beschriebenen Fehler. Hab das auch schon mit einer anderen Datei versucht.
      Selbst das funktioniert nicht:

      VB.NET-Quellcode

      1. Dim a = New System.IO.MemoryStream(My.Resources.theme)
      2. Dim _soundsourceTheme As IWaveSource
      3. _soundsourceTheme = New MP3.DmoMp3Decoder(a)
      4. _soundOut.Initialize(New LoopStream(_soundsourceTheme))
      5. _soundOut.Play()

      Irgendwas muss ich doch falsch machen -.-

      Liebe Grüße
      sothere

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

      Fehler gefunden!
      Damit das ganze funktioniert, muss in der RESX-Datei noch folgendes durchgeführt werden:

      XML-Quellcode

      1. <data name="theme" type="System.Resources.ResXFileRef, System.Windows.Forms">
      2. <value>..\Resources\theme.mp3;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      3. </data>


      Soll bedeuten: Statt das nach theme.mp3;System.Byte[] kommt muss das ganze als Memory Stream deklariert werden.
      Der Code zum Wiedergeben ist dann eigentlich recht simpel:

      VB.NET-Quellcode

      1. Dim _soundsource = New DmoMp3Decoder(ResourceManager.GetStream("theme"))

      Liebe Grüße
      sothere
      Hi,

      Ich versuche mit CSCore eine WAV-Datei wiederzugeben.
      Leider wird nichts abgespielt.

      VB.NET-Quellcode

      1. Using soundSource As IWaveSource = GetBackgroundSoundSource()
      2. 'SoundOut implementation which plays the sound
      3. Using soundOut As ISoundOut = GetSoundOut()
      4. 'Tell the SoundOut which sound it has to play
      5. soundOut.Initialize(soundSource)
      6. 'Play the sound
      7. soundOut.Play()
      8. End Using
      9. End Using
      10. Private Function GetSoundOut() As ISoundOut
      11. If WasapiOut.IsSupportedOnCurrentPlatform Then
      12. Return New WasapiOut()
      13. Else
      14. Return New DirectSoundOut()
      15. End If
      16. End Function
      17. Private Function GetBackgroundSoundSource() As IWaveSource
      18. 'return any source ... in this example, we'll just play a mp3 file
      19. Return CodecFactory.Instance.GetCodec("Resources/Audio/Menu/01.wav")
      20. End Function

      VB.NET-Quellcode

      1. Using soundSource As IWaveSource = GetBackgroundSoundSource()
      2. 'SoundOut implementation which plays the sound
      3. Using soundOut As ISoundOut = GetSoundOut()
      4. 'Tell the SoundOut which sound it has to play
      5. soundOut.Initialize(GetBackgroundSoundSource) ' soundsource
      6. 'Play the sound
      7. soundOut.Play()
      8. End Using
      9. End Using


      Wie kann ich eine Datei aus den Ressourcen wiedergeben?
      So funktioniert es:

      VB.NET-Quellcode

      1. Dim soundSource As IWaveSource = GetBackgroundSoundSource()
      2. 'SoundOut implementation which plays the sound
      3. soundOut = GetSoundOut()
      4. 'Tell the SoundOut which sound it has to play
      5. soundOut.Initialize(GetBackgroundSoundSource) ' soundsource
      6. 'Play the sound
      7. soundOut.Play()

      soundOut habe ich als Public deklariert, damit es beim beenden gestoppt werden kann.

      Wenn ich das Programme beende, bekomme ich folgende Fehlermeldung:
      Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in CSCore.dll aufgetreten.
      Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

      VB.NET-Quellcode

      1. Private Sub MenuForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
      2. soundOut.Stop()
      3. End Sub
      Also wenn du eine ​NullReferenceException kriegst, hat das nichts mit der asynchronen Wiedergabe zu tun (@'ChOoSeMyNaMe') sondern damit, dass die Variable ​soundOut in dem Moment des Aufrufs ​Nothing ist. Du musst also prüfen, ob ​soundOut ​Nothing ist, bevor du ​.Stop() aufrufst. Das geht folgendermaßen:

      VB.NET-Quellcode

      1. ​If soundOut IsNot Nothing Then
      2. soundOut.Stop()
      3. End If
      Wenn ich nur das angebe, bekomme ich den selben Fehler:

      VB.NET-Quellcode

      1. Private Sub MenuForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
      2. If soundOut IsNot Nothing Then
      3. soundOut.Stop()
      4. End If
      5. End Sub


      Wenn ich vorher aber soundOut = Nothing mache, Verschwindet das Formular, aber das Porgramm wird weiter ausgeführt und der Background-Sound läuft weiter.

      VB.NET-Quellcode

      1. Private Sub MenuForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
      2. soundOut = Nothing
      3. If soundOut IsNot Nothing Then
      4. soundOut.Stop()
      5. End If
      6. End Sub
      Was ist denn nun die Anforderung? Wenn du es async wiedergeben willst musst du dir eine Referenz speichern. Wichtig ist, da native Komponenten verwendet werden, dass alles korrekt freigegeben wird. Mach dir am besten eine Stop-Sub in welcher du soundOut.Dispose() aufrufst falls soundOut nicht Nothing ist.
      Diese Sub rufst du im Closing Event auf und gleich am Anfang der GetSoundOut Sub.
      Analog für die waveSource (natürlich dann nicht in der GetSoundOut Sub sondern in der GetWaveSource was auch immer Sub).

      Stell sicher, dass wenn du etwas neues instanzierst das alte frei gibst und wenn die App schließt ebenfalls alles freigegeben wird.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.