ich möchte in mein c++ Opengl Programm Ton einbauen.
genauer: Ich möchte ein Lied (wav format) abspielen und dabei die Lautstärke regeln können. Um schöne übergänge zwischen den Liedern zu machen brauche ich noch ein zweites Lied, dessenLautstärke ich unabhängig des ersten regulieren kann.
Kann mir jemand einen Tip geben, wie man das macht?
Beim suchen im Internet bin ich auf WaveOut gestossen. Damit sollte es klappen. Allerdings konnte mein compiller die Klasse WaveOut nicht finden und ich habe keine Ahnung wie ich das Problem lösen könnte.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
OpenGL ist eine Graphics Library, und kann daher nur Grafik. Ich hab dein Thema deshalb auch mal verschoben. WaveOut ist das grundlegenste unter Windows, kann aber kaum was. Bessere Alternative wäre OpenAL (das direkt aber nichts mit OpenGL zu tun hat) oder andere Soundlibs wie FMOD oder BASS.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Was meinst du mit "Problem"? Klappt etwas nicht, oder möchtest du halt einfach Sound in deiner Anwendung? Wenn Letzteres, dann schau hier im Forum, hier gibt es die OpenAL-Header von noeska (falls du Delphi verwendest), ansonsten halt mal auf [url=OpenAL.org]openal.org[/url] schauen, da gibts C++ Header und auch Beispiele etc.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn du Lieder ineinander übergehen lassen willst wirst du um eine Soundlibrary nicht herumkommen. OpenAL ist halt komplett frei, aber zum Streamen und für die Übergänge muss man halt einiges selber machen. Für Anfänger ist daher BASS oder FMOD die bessere Wahl, die sind frei für nicht-kommerzielle Zwecke und erlauben es dir direkt Lieder zu streamen. Oder schau dir mal Audorra von einem unserer Mitglieder an, wobei ich da nicht sicher bin obs auch mit C++ läuft.
Für dein "Problem" empfehle ich dir SDL_Mixer. Noch einfacher geht es kaum.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
WaveOut ist quasi "fire-and-forget". Wenn du etwas mit Playsound abspielst (was man bei einem kompletten Lied eh nicht machen sollte) dann verlierst du direkt nach diesem Kommando jeglichen Zugriff auf das was abgespielt wird, kannst an der Ausgabe also nix mehr verändern (ausser evtl. diese zu stoppen).
Du wirst also etwas anderes als WaveOut nehmen müssen, entweder eine der Libs die ich vorgeschlagen hab, oder das von Ziz erwähnte SDL und seinen Mixer (auch eine gute Alternative, SDL bietet ja diverse "Helfer" die man brauchen kann).
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das ist Geschmackssache und hängt v.a. von deinen Anforderungen ab, da musst du selbst evaluieren. Also am besten alle Features der einzelnen Libs mal überfliegen und gut ist. Unter Windows nutzen die auf unterster Ebene sowieso allesamt DirectSound (auch OpenAL), die können als fast alle das gleiche. Ich selbst hab mir daher einen Wrapper geschrieben (quasi ein SoundSystem) dass FMOD, BASS und OpenAL kapselt. So kann ich nach Belieben wählen was ich selbst verwenden will.
SDL hat den Vorteil, dass man damit später auch andere Dinge wie das OpenGL-Initiliasieren, Event-Handling, Input-Output, Thread, Netzwerk, etc. sehr einfach machen kann. Wobei das Wegkapseln zu einer plattformunabhängigen Lösung für dich bestimmt nicht Primärziel ist.
Hier wird step by step erklärt, wie man z.B. eine Wav-File ausgibt. Dabei kannst du den Teil, wo auch ein Fenster erstellt wird, getrost weglassen, also kein kein SDL_INIT_VIDEO und kein
Code:
SDL_Surface *screen; screen = SDL_SetVideoMode(320, 240, 0, SDL_ANYFORMAT); if (screen == NULL) { fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError()); return 1; }
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Haut mir die virtuelle Rübe ab, aber wenn du keine Bibliotheken herunterladen möchtest kannst du auch DirectX 7 verwenden. Das ist auf jedem Windows Rechner seit 2000 drauf und auf den meisten älteren Windows Systemen auch. DirectSound hast du natürlich nur unter Windows, aber das trifft auf PlaySound/WaveOut natürlich genauso zu. Was du mit SDL, Bass, FMOD und co. vor allem gewinnst, ist dass dein Programm portabel wird, du also auch eine Version für MacOS oder Linux kompilieren kannst. Ich selbst habe leider auch null Ahnung von Sound-Bibliotheken, deshalb halte ich jetzt auch meine klappe. Du könntest auch die Wave-Dateien selbst zusammen mischen. Das hätte ich vermutlich damals gemacht. Also im Grunde die Dateien in den Speicher laden und die letzten Samples der ersten Datei mit denen der nächsten zusammenlegen. Unkomprimierte Wave-Dateien sind letztlich ja nur aneinandergereihte 16-bit-Zahlen (und der Header). Und dann spielst du die fertig gemischte Datei im Speicher wieder mit WaveOut ab. Aber das ist bei mir typbedingt. Ich muss immer alles ein mal selber gemacht haben, und verweigere mich oft hartnäckig Hilfsbibliotheken. Abgesehen von solchen persönlichen Vorlieben muss man klar sehen, dass man mit fertigen Bibliotheken meist schneller zum Ziel kommt.
- Willst du unabhängig von Windows sein? - Gibt es dir ein gutes Gefühl, selbst den Kleinkram, der in deinem Programm steckt zu erarbeiten? - Hast du einen engen zeitlichen Rahmen? - Willst du in Zukunft 3D Sound, Tracker Musik o.Ä. verwenden? - Wie wichtig ist die Zusammenarbeit mit OpenGL? - Welche IDE/Compiler verwendest du? MS VisualC++ hat vermutlich Header für DirectSound im Installationspaket und du sparst dir Bastelei wenn was nicht klappt.
Hier noch mal eine Liste, um dir die Entscheidung zu erschweren ^^:
Andererseits sind die Bibliotheken wie Bass, OpenAL, SDL_Mixer und Co auch Vereinfachungen, wo die DirectSoundLib u.U. mehr Aufwand braucht.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
So sähe der Code aus, um in DirectSound mit C# das klassische 'ding!' mit Chorus und Echo abzuspielen. Hatte auch schon befürchtet man müsse die Puffer kompliziert initialisieren, aber das geht schon oder?
Code:
Device dev = new Device(); dev.SetCooperativeLevel(this,CooperativeLevel.Normal);
//Create and setup the buffer description. BufferDescription buffer_desc = new BufferDescription(); buffer_desc.ControlEffects = true; //this has to be true to use effects. buffer_desc.GlobalFocus = true; //play sound even if application loses focus.
//Create and setup the buffer for playing the sound. SecondaryBuffer buffer = new SecondaryBuffer( @"C:\WINDOWS\Media\ding.wav", buffer_desc, dev);
//Create an array of effects descriptions, //set the effect objects to echo and chorus and //set it in the buffer. EffectDescription[] effects = new EffectDescription[2]; effects[0].GuidEffectClass = DSoundHelper.StandardEchoGuid; effects[1].GuidEffectClass = DSoundHelper.StandardChorusGuid; buffer.SetEffects(effects);
Die Lautstärke kann man vermutlich mit einem Fade-In/Out-Filter am Anfang bzw. Ende des Liedes beeinflussen. Wenn nicht, könnte man auch nach jedem Bild die Lautstärken anpassen, was etwas holprig klingen könnte, wenn die Anwendung 'ruckelt'.
In BASS kannst du die Lautstärke mit folgendem Kommando automatisch in den nächsten 1000ms auf Null bringen:
Du kannst BASS wenn ich das richtig verstanden habe auch dazu bringen, deine Anwendung zu informieren, wenn nur noch eine Sekunde Spielzeit des ersten Liedes verbleiben, damit du das FadeOut des ersten Liedes und das FadeIn des zweiten exakt timen kannst. Danke für den Thread, jetzt weiß ich mehr
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.