2011-07-18 23 views
7

Jestem doświadczonym programistą MFC od wielu lat, który od niedawna rozwija komercyjne aplikacje w Objective C na Maca i iOS - staram się przyspieszyć .Net i C# (ponieważ wkrótce będę musiał przekonwertować jedną z moich komercyjnych aplikacji z Maca na PC).Odtwarzanie dźwięku w .Net/C#

Przeanalizowałem teraz kilka książek i jako ćwiczenie, aby lepiej poznać .Net (i C#) Zdecydowałem się na konwersję jednej z moich komercyjnych aplikacji na .Net jako ćwiczenie do nauki i wszystko idzie dobrze (interfejs działa, struktury danych wszystko dobre), ale muszę mieć możliwość odtwarzania dźwięku.

Moja aplikacja Mac generuje dźwięk z serii formuł matematycznych - wyobraź sobie generator fal - nie całkiem taki sam, ale podobny. Na komputerze Mac generuję audio jako 16-bitowe, podpisane nieprzetworzone audio, używam Core Audio do ustawienia routingu wyjścia audio, a następnie uzyskuję wywołanie zwrotne, gdy do routingu audio wymagany jest nowy bufor audio (dzięki czemu mogę generować dźwięk w locie) .

Potrzebuję zrobić to samo na komputerze. Niestety uważam, że dokumentacja MSDN jest przypadkiem "Nie widzę drewna dla drzew", ponieważ jest tak ogromna ilość dokumentacji. Mogę znaleźć klasy, które pozwolą mi ładować i odtwarzać pliki mp3/wav etc, ale muszę wygenerować audio w czasie rzeczywistym. Czy każdy może wskazać mi właściwy kierunek, aby znaleźć coś, co pozwoli mi na wypełnianie buforów w locie podczas ich odtwarzania?

Thx

+0

niewiele wiem na ten temat, ale uważam, że ten artykuł * siła * help: http://channel9.msdn.com/coding4fun/articles/Generating-Sound-Waves- z oscylatorami C-Wave –

+0

Spójrz na to: [Odtwórz dźwięk ze strumienia za pomocą C#] (http://stackoverflow.com/questions/184683/play-audio-from-a-stream-using-c) – Rodney

Odpowiedz

3

Użyłem this sample w kilku projektach z dobrymi wynikami. Zasadniczo jest to .Net wrapper dla Windows Waveform Audio API przy użyciu P/Invoke. Inne opcje:

+0

Wszystkie bardzo użyteczne i demo sinusoidalne na stronie NAudio wydaje się robić dokładnie to, co chcę, powinienem móc modyfikować ten kod i uzyskać wynik, którego potrzebuję, dziękuję bardzo! –

+0

Po około godzinie pracy NAudio zaczął działać i działał perfekcyjnie - moja aplikacja jest teraz ekspresywnie dźwięczna! Wielkie dzięki za sugestię! : O) –

+0

Cieszę się, że ci się podobało. – yms

2

używam Audiere do osiągnięcia tego celu i uważają, że działa bardzo dobrze.

Jest to biblioteka w języku C++, ale dostępna jest wersja set of bindings dostępna dla języka C#.

Aby uzyskać więcej informacji, zobacz the question I asked.

+0

Dzięki, przyjrzymy się! –

2

Powinieneś rzucić okiem na FMOD, który pozwala na tego rodzaju operacje i wiele więcej. Jest to również platforma wieloplatformowa, która może być zainteresowana, jeśli pracujesz również na komputerze Mac.

+0

Brzmi interesująco, popatrzę na to, dzięki. –

3

Utworzyłem klasę, która może odtwarzać dźwięk podany jako Stream jako sygnał wejściowy. Jeśli więc jesteś w stanie spakować generator dźwięków do kompatybilnego interfejsu Stream, może być odpowiedni dla ciebie.

Jak to zrobiłem - użyłem niezarządzanych metod waveOut* ze starego multimedialnego interfejsu API systemu Windows i odtworzyłem odtwarzanie z tego miejsca.

Inne opcje - o których jestem świadomy - użyj waveOut bezpośrednio, z tego: http://windowsmedianet.sourceforge.net/ lub napisz swój własny filtr źródłowy DirectShow, ale może to być zbyt skomplikowane, ponieważ musi być napisane w języku C++.

Jeśli jesteś zainteresowany wypróbowaniem mojego komponentu, mogę udostępnić go bezpłatnie, ponieważ potrzebuję go przetestować w wersji beta (użyłem go tylko w kilku moich projektach).

EDIT:

Ponieważ istnieje 6 upvotes na pytanie, Podaję mój komponent bezpłatnie (jeśli okaże się przydatne) tutaj: http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip

Może można zastanowić się nad tym :)

+0

Ponownie, mnóstwo odpowiedzi, przyjrzy się temu również, da ci informację zwrotną, gdy już spróbuję. Twoje zdrowie. –

1

Alvas.Audio ma 3 odtwarzaczy audio: Player

 player.FileName = "123.mp3"; 
     player.Play(); 

PlayerEx

 public static void TestPlayerEx() 
     { 
      PlayerEx plex = new PlayerEx(); 
      plex.Done += new PlayerEx.DoneEventHandler(plex_Done); 
      Mp3Reader mr = new Mp3Reader(File.OpenRead("in.mp3")); 
      IntPtr format = mr.ReadFormat(); 
      byte[] data = mr.ReadData(); 
      mr.Close(); 
      plex.OpenPlayer(format); 
      plex.AddData(data); 
      plex.StartPlay(); 
     } 

     static void plex_Done(object sender, DoneEventArgs e) 
     { 
      if (e.IsEndPlaying) 
      { 
       ((PlayerEx)sender).ClosePlayer(); 
      } 
     } 

i RecordPlayer

 public static void TestRecordPlayer() 
     { 
      RecordPlayer rp = new RecordPlayer(); 
      rp.PropertyChanged += new PropertyChangedEventHandler(rp_PropertyChanged); 
      rp.Open(new Mp3Reader(File.OpenRead("in.mp3"))); 
      rp.Play(); 
     } 

     static void rp_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      switch (e.PropertyName) 
      { 
       case RecordPlayer.StateProperty: 
        RecordPlayer rp = ((RecordPlayer)sender); 
        if (rp.State == DeviceState.Stopped) 
        { 
         rp.Close(); 
        } 
        break; 
      } 
     } 
Powiązane problemy