# Musik in C++



## Kimble (7. April 2002)

hi,
Ich programmier grad eine Grafikdemo in OpenGL. Allerdings möchte ich auch noch Hintergrundmusik haben.
Wie schaffe ich es, dass ich Musik OHNE DirectSound abspielen kann, also mit normalen "Windows-Mitteln"???

Bitte antworten, is wirklich wichtig!!!
Danke schon im vorraus!!!


----------



## Xeragon (7. April 2002)

Durch die Library eines Drittanbieters z.b. FMOD (http://fmod.org), Windows Multimedia (MSDN Library -> Graphics and Multimedia -> Windows Multimedia; ) etc.


----------



## Daniel Toplak (7. April 2002)

Über diverse API-Funktionen läst sich das auch machen, da kann man .wav oder .mp3 dateien abspielen. Diese Funktionen sind in der winmm.dll zusammengefasst. Ein Beispiel wäre die Funktion:

sndPlaySound()

Gruss Homer (der dir viel Spass beim musizieren wünscht *g*)


----------



## Xeragon (7. April 2002)

sndPlaySound() und Konsorten gehören zu "Windows Multimedia" .


----------



## Kimble (7. April 2002)

hm, nuja hab mir das angeguckt, habt ihr vielleicht auch 'en Beispiel?


----------



## Daniel Toplak (8. April 2002)

Also für .wav hab ich was gefunden und zwar ist es wichtig, dass du die Datei winmm.lib in den Linker einbindest und die Datei mmsystem.h includierst.

Dann rufst du die Funktion so auf:

PlaySound("C:\\test.wav", NULL, SND_FILENAME)

dann wird die datei test.wav abgespielt, funzt aber nur mit .wav datei, mit MP3 musst du schauen, dürfte etwas komplizierter sein, da du ja über die Audiokompression gehen musst, oder du suchst dir ein Programm, das MP3's in WAV's umwandelt, die werden natürlich dann grösser aber zum probieren tuts ja eine kleine Datei.

Gruss Homer


----------



## Daniel Toplak (8. April 2002)

Ach ja bezüglich zu den MP3's schau dir mal die mmio-Funktionen an mit mmioOpen() kann man glaub ich auch MP3's abspielen. Musst hald mal ausprobieren, ich denk wenn du OpenGL hinbekommst dann ist das doch ein kinderspiel oder?
Kannst ja mal reinposten wenns funktioniert hat, wie du es gemacht hast.

Gruss Homer


----------



## Kimble (8. April 2002)

DANKE HOMER!!!  
Mit dem *.wav abspielen klappt's!!!
mp3 probier ich jezt noch


----------



## Xeragon (8. April 2002)

AFAIK brauchst du zum MP3 decoden eine Lizenz dafür.
mmio*() ist IIRC dazu da um RIFF-Files leichter lesen zu können, d.h. du müsstest es selbst decoden.


----------



## Googy (24. April 2002)

Huhu!!

Also, ich kann dir da nur DirectX Audio empfehlen!!! 

Das ist das beste wenn du dein OpenGl-Demo für Win32-Platformen schreibst!!!!

Du kannst dann auch 3D-sound benutzen!! Also echt empfehlungswert!!!


----------



## dYn (8. November 2003)

*y bin *

Hi, hab da grad gelesen, wie das mit dem PlaySound gehen soll.
Bei mir kommen aber immer einige Fehlermeldungen.
Der Debugger makiert immer diese Zeile :

typedef UINT        MMVERSION;  /* major (high byte), minor (low byte) */

in der mmsystem.h.

Kann das daher kommen, das ich die lib Datei falsch eingebunden habe ?!

Wenn ja, kann mit jmd genau sagen, wie ich das mache ?! 

ps : wenn ich einfach nur ne wave in ner konsole als hintergrund zu nem kleinen Programm ablaufen lassen will, is das doch ne geeignete Funktion oder !?

mfg dYn


Edit :

Mal ne dumme frage am rande, bindet der dann beim compilen die wave mit ein oder muss ich die dann immer im ordner haben wo auch die exe ist ?


----------



## basd (9. November 2003)

die *.wav wird nicht eingebunden und muss im ANGEGEBENEN pfad sein .. d.h kann der pfad der ausführung sein wenn du kein pfad sondern nur den Namen angibst

wegen dem compiler problem , kannn ich nur rate ... versuche mal windows.h vor allen includes zu includieren (hilft fast immer)


----------



## deleo (17. Dezember 2007)

Hallo,

Bei mir makiert der Debugger auch immer die Zeile:

 typedef UINT        MMVERSION;  /* major (high byte), minor (low byte) */   

Ich hab auch, wie in anderen foren beschrieben #include <mmsystem> includet und #pragma comment (lib, "winmm.a") gelinkt
Und den Befehl: sndPlaySound("04 - Dead Eyes See No Future.wav",SND_FILENAME|SND_ASYNC); verwendet.

Wenn ich jetzt noch wie hier beschrieben #include <windows> include, dann kommt zwar nicht mehr der oben genannte Fehler, aber dafür ein neuer und zwar:

[Linker Fataler Fehler] Fatal: Unable to open file 'WINMM.A'

Ich verwende den Borland c++ Builder 6

Hoffentlich kann mir jemand von euch Helfen 

Danke schon mal im Vorraus


----------



## Schwiizer (7. Dezember 2009)

Hat hier jemand schon eine Lösung dazu gefunden?
Danke schon im Voraus für Eure Antworten!


----------



## Unregistriert (10. Dezember 2009)

Hallo alle zusammen!

Könnte mir diese Frage vielleicht jemand beantworten?
Vielen Dank schon im Voraus!
Mfg dä Schwiizer


----------



## DMANZI (9. März 2010)

Hats bei mir auch angezeigt, dan hab ich einfach das hergenommen:

#include <iostream>
#include <windows.h>
#pragma comment(lib,"winmm.lib")
using namespace std;
int main ()
{
	PlaySound(TEXT("Foo_Fighter-learn_to_fly.wav"), NULL, SND_FILENAME);
}


so müsste das nämlich gehen,
für weitere befehle siehe 
http://msdn.microsoft.com/en-us/library/ms712879(VS.85).aspx#Mtps_DropDownFilterText


----------



## baigox (21. April 2010)

hey 
Bei mir zeigt er immer

```
[Linker error] undefined reference to `PlaySoundA@12' 
ld returned 1 exit status
```
an
ich habs genauso wie DMANZI gemacht.
Kanns am DevCpp liegen?


----------



## sheel (22. April 2010)

Soweit ich weiß, wird pragma comment nur von den MS-Compilern unterstützt
Du musst die winmm.lib anders einbinden, heißt wahrscheinlich "Projektoptionen" oÄ.


----------



## baigox (22. April 2010)

ich mach das nie mit Projekt, ich mach immer mit Quelldatei


----------



## deepthroat (22. April 2010)

baigox hat gesagt.:


> ich mach das nie mit Projekt, ich mach immer mit Quelldatei


Das funktioniert aber nur solange wie du keine Optionen einstellen mußt, wie z.B. zusätzliche Bibliotheken einzubinden.

Mach ein Projekt.

Gruß


----------



## Crash Kid (23. April 2010)

Hallo an alle,

also ich verwende zum abspielen der MP3, WAV und WMA die Funktion mciSendString(). Dazu muss man auch die Libary 'winmm' dazu linken.
Nachteil bei der Funktion ist, dass man nur Dateien abspielen kann die kein LEERZEICHEN enthalten. Aber dazu hab ich auch eine Lösung gefunden.
Mann muss zuvor einfach die Funktion GetShortPathName() auf den Dateipfad anwenden. 

Hier noch ein kleines Beispiel


```
#include <windows.h>

...

char cMusik_Dateipfad[256];
string stMusik_Musikbefehl;
long lMusik_length = 0;
TCHAR* tcMusik_buffer = NULL;

...

lMusik_length = GetShortPathName(cMusik_Dateipfad, NULL, 0);
tcMusik_buffer = new TCHAR[lMusik_length];
lMusik_length = GetShortPathName(cMusik_Dateipfad, tcMusik_buffer, lMusik_length);

stMusik_Musikbefehl =  "open ";
stMusik_Musikbefehl = stMusik_Musikbefehl + tcMusik_buffer;
mciSendString(stMusik_Musikbefehl.c_str(), NULL, 0, 0);

stMusik_Musikbefehl = "play ";
stMusik_Musikbefehl = stMusik_Musikbefehl + tcMusik_buffer;
mciSendString(stMusik_Musikbefehl.c_str(), NULL, 0, 0);

...
```

Bei Funktioniert dass immer hervorragend ohne Fehler.


----------



## baigox (23. April 2010)

Hey Crash Kid
nichts gegen dich
aber da fehlen:

```
#include<string>
using namespace std;
int main()
{
 
}
```
gut wäre auch ein "system("pause");", damit er nicht einfach aufhört!
das sieht dann so aus::


```
#include <windows.h>
#include <string>
using namespace std;
int main()
{
char cMusik_Dateipfad[256]=("musik.wav");
string stMusik_Musikbefehl;
long lMusik_length = 0;
TCHAR* tcMusik_buffer = NULL;
 
lMusik_length = GetShortPathName(cMusik_Dateipfad, NULL, 0);
tcMusik_buffer = new TCHAR[lMusik_length];
lMusik_length = GetShortPathName(cMusik_Dateipfad, tcMusik_buffer, lMusik_length);
stMusik_Musikbefehl =  "open ";
stMusik_Musikbefehl = stMusik_Musikbefehl + tcMusik_buffer;
mciSendString(stMusik_Musikbefehl.c_str(), NULL, 0, 0);
stMusik_Musikbefehl = "play ";
stMusik_Musikbefehl = stMusik_Musikbefehl + tcMusik_buffer;
mciSendString(stMusik_Musikbefehl.c_str(), NULL, 0, 0);
system("pause");
}
```
*NATÜRLICH NOCH DIE LIBDATEI"libwinmm.a" EINBINDEN OHNE GEHTS NICHT*
das hattest du auch aba ich wollte nochmal drauf hinweisen.
bei DevCpp ist die unter "C:/Program files/Dev-Cpp/lib/libwinmm.a" zu finden
das geht unter::
ALT+P drücken
in "Parameter" gehen
auf "bibliothek/Objekt hinzufügen" klicken
datei "C:/Program files/Dev-Cpp/lib/libwinmm.a" auswählen
dann gehts(aba nur mit Projekt)

Jetzt gibt es keine Probleme mehr?


----------



## Crash Kid (23. April 2010)

Hallo baigox,

das ist richtig. ABER: Darum habe ich in meinem Quellcode auch ... eingefügt, was bedeuten soll, dass ich diese Sachen wie int main() überspringe. Die wichtigesen Sachen habe ich alle hingeschrieben.
Es kann auch sein dass er die WinAPI benutzt. Dann würde da nichts von int main() usw. stehen. Deswegen meine ... !
Ich gehe davon aus, dass jeder weiß das das so nicht geht. Es soll auch nur eine Denkanregung sein und keine komplette Lösung. 
Dafür ist das Board nicht da, dass wir die arbeit von anderen machen. Jeder der ein Problem hat, helfen wir. Aber wir machen nicht seine "Hausaufgaben".

Schöne Grüße


----------



## baigox (24. April 2010)

Hallo Crash Kid

E N T S C H U L D I G U N G. Aber: ich war so froh nach wochenlanger suche mit über 100 fehlgeschlagenen Versuchen, da wollte ich mein Erfolg mit anderen teilen.
ja, andere hätten auch darauf kommen könen aber: E N T S C H U L D I G U N G:  
Aber auch Danke für deinen Beitrag, ohne den hätte ich es nie geschafft!!


----------



## Crash Kid (24. April 2010)

Ja kein Ding,

dann ist ja gut wenn ich jemandem helfen konnte. Entschuldigung angenommen ;-).
Viel Spaß dann noch damit...

grüße


----------



## brunlorenz (1. Mai 2010)

Hier ne Funktion (benötigt allerdings eine Ressource z.B. TEST WAVE "C:\\deine.wav")

```
#include <mmsystem.h>
#include <windows.h>
BOOL PlaySoundResource(LPSTR lpName)
{
    BOOL bRtn;
    LPSTR lpRes;
    HANDLE hRes;
    HRSRC hResInfo;
    HINSTANCE Nl;
	Nl=hInstance;

    /* Find the WAVE resource. */
    hResInfo= FindResource(Nl,lpName,"WAVE");
    if(hResInfo == NULL)
       return FALSE;
    /* Load the WAVE resource. */

    hRes = LoadResource(Nl,hResInfo);
    if (hRes == NULL)
      return FALSE;

    /* Lock the WAVE resource and play it. */
    lpRes=(LPSTR)LockResource(hRes);
    if(lpRes==NULL)
      return FALSE;
    bRtn = sndPlaySound(lpRes, SND_MEMORY | SND_ASYNC);
    if(bRtn == 0)
      return FALSE;

    /* Free the WAVE resource and return success or failure. */
    FreeResource(hRes);
    return TRUE;
}
```
Der Parameter ist dann in meiner Ressource TEST 
PS: Du musst noch libwinmm.a beim Linker einbinden, falls du sie nicht hast, ist sie im angehängten ZIP-Archiv gepackt 

lorenz


----------



## brunlorenz (2. Mai 2010)

Wenn du die Bibliothek nicht hast, lädst sie dir von hier runter (hab sie gepostet), benennst
sie um und kopierst sie zu den anderen LIBs 

Wenn's nicht geht, melde dich wieder
Hoffentlich klappt's dann


----------

