PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Sound


hasang321654
2003-01-27, 19:06:20
Hallo,
Ich habe eine Frage uns war wollte ich euch mal Fragen, wie man z.B wenn man eine Taste auf der Tastatur drückt ein Sound kommen soll.
Bitte macht es mir nicht allzu schwer! Ich bin grad bei den Klassen und erst 12 Jahre alt!

Nasenbaer
2003-01-27, 22:45:06
cout << "\a";
Müsste imo den Standard Ding-Sound von Windows ausgeben.

Wenn du ne bestimmte Datei abspielen willst wirds aber etwas komplexer. :)

Mfg Nasenbaer

Xmas
2003-01-28, 04:43:43
Für das Abspielen einer wav-Datei gibt es unter Windows die Funktion
PlaySound( "Dateiname.wav", NULL, SND_FILENAME );

Wenn es kein Windows-Programm ist, sollte der Vorschlag von Nasenbaer helfen.

hasang321654
2003-01-28, 15:04:37
Nasenbaer vielen dank aber gibt es mehrere solcher "DONGS"? Also solcher Töne die der Computer von sich gibt, wenn man z.B kein Dong will sondern ein Ding das es akzeptiert wurde.

Es sollte mit CIN sein, man sollte daraus durch diese "DONGS" und "DINGS" Melodien spieln können.

Nasenbaer
2003-01-28, 19:13:51
Originally posted by Xmas
Für das Abspielen einer wav-Datei gibt es unter Windows die Funktion
PlaySound( "Dateiname.wav", NULL, SND_FILENAME );

Wenn es kein Windows-Programm ist, sollte der Vorschlag von Nasenbaer helfen.

Ach es ist doch so einfach?? Hm vor ner Zeit braucht ich das mal aber in der Doku muss ich die wohl komplett übersehen haben. :|

@hasang321654

Also mit cin wirds wohl nicht gehen. "a\" Ist ein kodiertes Zeichen, das man mit cout ausgeben kann. Unter nem DOS-Programm müsste sich dann der PC-Speaker melden glaub ich.

Was möchtest du eigentlich machen? Meldodien mit Windows-Sounddateien spielen???

Mfg Nasenbaer

hasang321654
2003-01-28, 19:23:54
Nein das was ich machen will, ist dies wenn jemand etwas Falsches eingegeben hat, dass ich bestimme, dann soll es was ausgeben.

Nasenbaer es ist egal, wenn du das mit dem cin nicht kannst. Mir würde auch reichen wenn du mir für cout eine Liste erstellen würdest wenn du sie kennst?!


Vielen Dank im Voraus( auch wenn du es nicht kannst)

dark_shale
2003-01-28, 19:44:05
Mit turbo Pascal kannst du sounds machen. Ich glaube daher, dass es mit Turbo C auch gehen müsste, da es ja eine Funktion von Borland ist.

Bei C++ fällt mir gerade nichts ähnliches ein.

Xmas
2003-01-28, 21:05:35
Originally posted by hasang321654
Nein das was ich machen will, ist dies wenn jemand etwas Falsches eingegeben hat, dass ich bestimme, dann soll es was ausgeben.

Nasenbaer es ist egal, wenn du das mit dem cin nicht kannst. Mir würde auch reichen wenn du mir für cout eine Liste erstellen würdest wenn du sie kennst?!


Vielen Dank im Voraus( auch wenn du es nicht kannst)
Mit cin kann man nichts ausgeben. cout erlaubt lediglich das von Nasenbaer erwähnte Alert-Zeichen '\a', das einen Standardton erzeugt.

Ansonsten gibt es in C/C++ keine Standard-Funktionen zur Soundausgabe. Du kannst lediglich Betriebssystem-Funktionen verwenden oder den Speaker per Port-I/O programmieren (was unter WinNT/2k/XP nicht funktionieren dürfte).

hasang321654
2003-02-09, 13:43:27
Gibt es mehrere ALERT Zeichen?

Nasenbaer
2003-02-09, 13:58:44
Originally posted by hasang321654
Gibt es mehrere ALERT Zeichen?
Nope...

Mfg Nasenbaer

Einfachkrank
2003-02-09, 18:24:38
Hi,

passt zwar nich ganz so um Thema, aber ich hab da mal en kleines Prob. Ich hab mir ne kleine Klasse für DirectSound geschrieben, zum Initialisieren, laden von Wave Dateien und abspielen etc.
Wenn ich die jetzt aber abspiele, dann werden die Sounds nur einzeln nacheinander abgespielt, statt gleich in einer Reihe. (Als Beispiel, wenn man mit einem MG schießen würde, sollen ja auch alle Schüsse sofort hörbar sein). Muss ich dazu mehrere DirectSound Objekte anlegen und immer auf dem nächsten abspielen, oder wie mache ich das?

MFG Einfachkrank

Xmas
2003-02-10, 00:19:56
Originally posted by Einfachkrank
Hi,

passt zwar nich ganz so um Thema, aber ich hab da mal en kleines Prob. Ich hab mir ne kleine Klasse für DirectSound geschrieben, zum Initialisieren, laden von Wave Dateien und abspielen etc.
Wenn ich die jetzt aber abspiele, dann werden die Sounds nur einzeln nacheinander abgespielt, statt gleich in einer Reihe. (Als Beispiel, wenn man mit einem MG schießen würde, sollen ja auch alle Schüsse sofort hörbar sein). Muss ich dazu mehrere DirectSound Objekte anlegen und immer auf dem nächsten abspielen, oder wie mache ich das?

MFG Einfachkrank
Welche Version von DirectSound verwendest du, sprich welche Interfaces?

Einfachkrank
2003-02-10, 11:42:19
@Xmas
Ich habe nichts konkretes an Versionen angegeben, also denke ich mal, dass es dann 7 ist, oder? In Sachen DirectSound bin ich nicht auf dem neusten Stand...

Xmas
2003-02-10, 13:43:01
Aktuell ist 8. Dort musst du einfach nur mehrere Secondary Buffer anlegen und diese abspielen, das Mischen geschieht dann automatisch.

Zu den 7er Interfaces hab ich jetzt gar keine Dokumentation mehr...

Einfachkrank
2003-02-10, 14:32:31
Wo find ich en gutes Tut, was sich mit der 8er Version beschäftigt?

Nasenbaer
2003-02-10, 15:55:09
InitDAudio(HWND hWnd,char *Directory)
{
if(FAILED(CoInitialize(NULL)))
{
Error("COM_Bibliothek konnte nicht initialisiert werden (DxAudio).");
return -1;
}

if(FAILED(CoCreateInstance(CLSID_DirectMusicPerformance,NULL,CLSCTX_INPROC,
IID_IDirectMusicPerformance8,(LPVOID*)&lpPerformance)))
{
Error("DiretMusicPerformance-Objekt konnte nicht angelegt werden.");
return -1;
}

if(FAILED(CoCreateInstance(CLSID_DirectMusicLoader,NULL,CLSCTX_INPROC,
IID_IDirectMusicLoader8,(LPVOID*)&lpLoader)))
{
Error("DirectMusicLoader konnte nicht angelegt werden.");
return -1;
}

if(FAILED(lpPerformance->InitAudio(NULL,
NULL,
hWnd,
DMUS_APATH_DYNAMIC_STEREO,
64,
DMUS_AUDIOF_ALL,
NULL)))
{
Error("InitAudio wurde nicht erfolgreich abgeschlossen.");
return -1;
}

WCHAR Path[MAX_PATH];

MultiByteToWideChar(CP_ACP,0,Directory,-1,Path,MAX_PATH);

if(FAILED(lpLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,
Path,
FALSE)))
{
Error("DxAudio: Verzeichnis existiert nicht.");
return -1;
}


return 0;
}


Sieht deine Initialisierung bei dir ungefähr so aus?

Wenn du CoCreateInstance() IID_IDirectMusicPerformance8 übergibst dann ist es Version 8. :)

Tuts findest du sonst auch im Dx SDK.

Mfg Nasenbaer

Einfachkrank
2003-02-10, 19:27:49
Ja, ich bin mir jetzt sicher, dass ich Version 7 verwende, denn diese Form hatte ich auch schon ausprobiert und hatte aber nicht funktioniert. (Wusste aber nicht, dass das Version 8 Style ist :))