CSCore - Highperformance Audiobibliothek

    • Release
    • Open Source

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

      War auch schon eine Idee mit Mono. Nur dann müsste man von irgendwo her die decoder bekommen. Ist doch recht windows lastig :(.


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

      ThuCommix schrieb:

      Das wird nicht nur programmiertechnisch schwer, sondern auch Lizenzprobleme könnten im Weg stehen..

      Kurz: Doppelt-Unmöglich. Alleine nen MP4-Container format reicht schon als Großprojekt mit haufenweise Kosten aus ;). Ich meine ein Flac-Decoder geht ja noch locker. Ein OGG/Vorbis-Decoder würde auch noch gehen. Aber das sind einfach Kaliber die rühr ich nicht an :P.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Ja genau. Momentan starte ich einen Task der aller der eingestellten Latency prüft ob die WaveSource durchgelaufen ist. Gibt es da irgendwie ein Callback oder ein Event? Ich könnte theoretisch meine eigene WaveSource schreiben, die beim Read Aufruf checkt ob die Position == Length ist und dann ein Event feuert oder?

      Habs nun so gelöst, sollte funktionieren.

      C#-Quellcode

      1. // Copyright (c) 2012-2014 Sharpex2D - Kevin Scholz (ThuCommix)
      2. //
      3. // Permission is hereby granted, free of charge, to any person obtaining a copy
      4. // of this software and associated documentation files (the 'Software'), to deal
      5. // in the Software without restriction, including without limitation the rights
      6. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      7. // copies of the Software, and to permit persons to whom the Software is
      8. // furnished to do so, subject to the following conditions:
      9. //
      10. // The above copyright notice and this permission notice shall be included in
      11. // all copies or substantial portions of the Software.
      12. //
      13. // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      14. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      15. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      16. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      17. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      18. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      19. // THE SOFTWARE.
      20. using System;
      21. using CSCore;
      22. namespace Sharpex2D.Audio.XAudio2
      23. {
      24. [Developer("ThuCommix", "developer@sharpex2d.de")]
      25. [TestState(TestState.Tested)]
      26. internal class EventWaveSource : IWaveSource
      27. {
      28. /// <summary>
      29. /// Gets the WaveFormat.
      30. /// </summary>
      31. public CSCore.WaveFormat WaveFormat
      32. {
      33. get { return _waveSource.WaveFormat; }
      34. }
      35. /// <summary>
      36. /// Gets or sets the Position.
      37. /// </summary>
      38. public long Position {
      39. get { return _waveSource.Position; }
      40. set
      41. {
      42. _waveSource.Position = value;
      43. if (value < _waveSource.Length)
      44. {
      45. _isEofTriggered = false;
      46. }
      47. }
      48. }
      49. /// <summary>
      50. /// Gets the Length.
      51. /// </summary>
      52. public long Length { get { return _waveSource.Length; } }
      53. /// <summary>
      54. /// Triggered if the underlaying wave source is end of stream.
      55. /// </summary>
      56. public event EndOfStreamEventHandler EndOfStream;
      57. private readonly IWaveSource _waveSource;
      58. private bool _isEofTriggered;
      59. /// <summary>
      60. /// Initializes a new EventWaveSource class.
      61. /// </summary>
      62. /// <param name="waveSource">The IWaveSource.</param>
      63. public EventWaveSource(IWaveSource waveSource)
      64. {
      65. _waveSource = waveSource;
      66. }
      67. /// <summary>
      68. /// Deconstructs the WaveSource class.
      69. /// </summary>
      70. ~EventWaveSource()
      71. {
      72. Dispose(false);
      73. }
      74. /// <summary>
      75. /// Reads from the WaveSource.
      76. /// </summary>
      77. /// <param name="buffer">The Buffer.</param>
      78. /// <param name="offset">The Offset.</param>
      79. /// <param name="count">The Count.</param>
      80. /// <returns>Bytes read.</returns>
      81. public int Read(byte[] buffer, int offset, int count)
      82. {
      83. try
      84. {
      85. return _waveSource.Read(buffer, offset, count);
      86. }
      87. finally
      88. {
      89. if (Position == Length)
      90. {
      91. if (EndOfStream != null && !_isEofTriggered)
      92. {
      93. _isEofTriggered = true;
      94. EndOfStream(this, EventArgs.Empty);
      95. }
      96. }
      97. }
      98. }
      99. /// <summary>
      100. /// Disposes the object.
      101. /// </summary>
      102. public void Dispose()
      103. {
      104. Dispose(true);
      105. GC.SuppressFinalize(this);
      106. }
      107. /// <summary>
      108. /// Disposes the object.
      109. /// </summary>
      110. /// <param name="disposing">The disposing state.</param>
      111. protected void Dispose(bool disposing)
      112. {
      113. if (disposing)
      114. {
      115. _waveSource.Dispose();
      116. }
      117. }
      118. }
      119. }

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ThuCommix“ ()

      Ohne mich da jetzt genauer aus zu kennen, könnte man nicht die Encoder/Decoder von libav (abspaltung von ffmpeg ) nutzen ? Dann hätte man da schon mal die Platformunabhängigkeit.
      Ich brauche für ein Projekt eine einfache Möglichkeit, einen Sound mehrmals (und auch überlagernd) threadsafe abzuspielen. Kannst du eine API bereitstellen, bei der man mit ca. 2-3 Codezeilen eine MP3, WAV oder sonstwas-Datei abspielen kann? Ich würde gerne beim Programmstart 10 Audio-Dateien in den RAM laden und sie alle bis zu 10 mal gleichzeitig abspielen.

      Bisher hab ich mir aus deinem Sample-Code ne Wrapper-Methode geschrieben, das funktionierte allerdings nicht so, wie ich es mir vorstellte. Die Sounds sind dann doppelt so schnell geworden oder ich habe beim 3. abspielen ne Nullreference bekommen.
      Von meinem iPhone gesendet
      Was haste denn für einen Code versucht? Kannste mir den bitte mal zeigen?
      Wäre es auch ok XAudio2 zu verwenden? Was sind das für Audio-Dateien? Von dir? Gleiches Format, verschiedene Formate?


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Nur kurze Vorabinfo:
      CSCore kommt bald in Version 1.1. In letzter Zeit ist alles bisschen schief gelaufen. Jetzt wurde vieles angepasst, jedoch zu über 90% immernoch kompatibel. Habe jetzt die Änderung des letzten halben (oder sogar mehr ?( ) Jahres hochgeladen. Damit kommen wir auch schon zum nächsten Punkt:

      CSCore ist jetzt auf Github. Codeplex ist einfach tot, selbst die Login Funktion funktioniert nicht mehr wie sie soll. Bugs werden Monate lang nicht behoben (z.B. der Statistik bug).
      Deshalb ist CSCore absofort auf Github erreichbar: github.com/filoe/cscore

      Der aktuelle Source ist derzeit noch im version_1_1 branch. Wird aber demnächst auf master gemerged.

      Die Github Seite befindet sich vorerst im Aufbau. Mir fehlt heute die Zeit da anständig was draus zu machen. Kommt aber hoffentlich noch :).
      Eventuell bekomm ich ja noch den einen oder anderen Tipp. Da jetzt auch der größte Teil dokumentiert ist, könnte man auch darüber nachdenken eine SharpDox (braucht kein php, asp.net,...) auf Github-Pages zu stellen?

      Allgemein freut mich jede Beteiligung am Projekt. Pull-Requests sind ab jetzt auch wieder mehr als willkommen (allzu viele wirds nicht geben aber trotzdem :D ).
      Für alle die das Projekt toll finden, sich jedoch nicht in Form von source usw. beteiligen können/wollen, würde mich natürlich ein Star usw. ebenso freuen.
      Etwas bekanntheit würde dem Projekt gut tun :)



      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Also ein "normaler" Anwender merkt nix davon.
      Schau erstmal ob du ein normaler Anwender bist :D.
      Denn eventuell musst du dann dann 0% neu schreiben -> zu früh geärgert.
      Oder du musst eventuell 30% neu schreiben -> zu früh gefreut :P.
      Ne Spaß bei Seite. Es wird so gut wie nix neu zu schreiben sein.

      Wurde nur vieles überarbeitet, doku hinzugefügt usw.
      z.B. ist WaveOut neu implementiert. Sollte diesmal auch halbwegs stable laufen. Bei den Komponententests ist mal viele, viele Stunden nix schief gegangen. -> Also gebe ich dir min. 5 Minuten bis es kaput ist ;).


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