sound abspielen



  • sorry, aber so gut kenne ich mit jetzt noch nicht aus, das was du jetzt gerade geschrieben hast, damit kann ich leider nichts anfangen!!!

    Danke
    aqua5748



  • Wenn du willst kannst du es mal mit meiner PlaySound Klasse versuchen die ich vor Ewigkeiten geschrieben hab (eben noch einmal gestestet und funktioniert alles wunderbar):

    CSimpleSound.h

    #ifndef HEADER_CSIMPLESOUND_H
    #define HEADER_CSIMPLESOUND_H
    
    /*
    	Written by Listing 24.08.2011
    	Feel free to use for any purpose
    	There is no warranty of any kind
    */
    
    #include <windows.h>
    #pragma comment (lib, "Winmm.lib")
    
    enum PlaybackIdentifier
    {
    	PLAYBACK_START = 0,
    	PLAYBACK_STOP = 1
    };
    
    class CSimpleSound
    {
    public:
    	CSimpleSound(char * cFilename);
    	~CSimpleSound();
    
    	void Play(PlaybackIdentifier ePlay);
    
    protected:
    	char * GetFileName() {return m_Filename;}
    	static void PlaybackThread(CSimpleSound * cInstance);
    
    private:
    	char m_Filename[MAX_PATH];
    	HANDLE m_PlaybackThread;
    	PlaybackIdentifier m_Playback;
    };
    
    #endif
    

    CSimpleSound.cpp

    #include "CSimpleSound.h"
    
    CSimpleSound::CSimpleSound(char * cFilename)
    {
    	strncpy(m_Filename,cFilename,sizeof(m_Filename)/sizeof(char));
    	m_PlaybackThread = NULL;
    }
    
    CSimpleSound::~CSimpleSound()
    {
    	this->Play(PLAYBACK_STOP);
    }
    
    void CSimpleSound::Play(PlaybackIdentifier ePlay)
    {
    	m_Playback = ePlay;
    
    	if(m_PlaybackThread)
    	{
    		DWORD dwExitCode = NULL;
    		GetExitCodeThread(m_PlaybackThread,&dwExitCode);
    		if(dwExitCode != STILL_ACTIVE)
    		{
    			CloseHandle(m_PlaybackThread);
    			m_PlaybackThread = NULL;
    		}
    	}	
    
    	if(!m_PlaybackThread && ePlay==PLAYBACK_START)
    		m_PlaybackThread = CreateThread(0,0,reinterpret_cast<LPTHREAD_START_ROUTINE>(CSimpleSound::PlaybackThread),reinterpret_cast<LPVOID>(this),0,0);	
    }
    
    void CSimpleSound::PlaybackThread(CSimpleSound * cInstance)
    {
    	PlaySoundA(cInstance->GetFileName(), NULL,SND_ASYNC);
    
    	while(cInstance->m_Playback != PLAYBACK_STOP)
    		Sleep(5);
    
    	PlaySoundA(NULL, NULL, SND_PURGE);
    }
    

    Ein kleines, vollständiges Beispiel:

    #include "CSimpleSound.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	CSimpleSound MeinSound("C:\\PumpAbDasBier.wav");
    	for(unsigned int i = 0; i < 2; ++i)
    	{
    		cout << "Wiedergabe wird gestartet!" << endl;
    		MeinSound.Play(PLAYBACK_START); //Starte die Wiedergabe
    		cout << "Bitte druecken Sie eine Taste um die Wiedergabe zu beenden!" << endl;
    		system("Pause");
    		MeinSound.Play(PLAYBACK_STOP);
    		system("Pause");
    	}
    
    	system("Pause");
    }
    

  • Mod

    @listing: Nurmalso ein paar Dinge die ich nicht OK finde:
    1. Warum ein anderer Thread wenn PlaySound sowieso schon asynchron abspielen kann?
    2. Warum ein Sleep in dem Thread und kein Event un WaitForSingleObject
    3. Warum CreateThread in einem Programm das dir CRT benutzt und nicht _beginthread?
    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/



  • @Martin:
    Vielen Dank für die Hinweise, 2. und 3. waren mir noch garnicht klar. Wenn es sowieso asynchron geht sollte der Thread-ersteller meinen Beitrag wohl ignorieren 😃



  • oke, also funktioniert jetzt der Quellcode nicht richtig oder wie ?



  • aqua5748 schrieb:

    oke, also funktioniert jetzt der Quellcode nicht richtig oder wie ?

    Doch er funktioniert, aber er hat ein paar programmiertechnische schönheitsfehler und ist überflüssig weil wenn man asynchron abspielt sollte sowieso das gleiche dabei rauskommen.



  • ja oke, und wie würde das aussehen wenn ich es asynchron abspiele ? kannst du mir vielleicht mal ein Beispiel zeigen ?

    Danke
    mfg aqua5748


  • Mod

    aqua5748 schrieb:

    ja oke, und wie würde das aussehen wenn ich es asynchron abspiele ? kannst du mir vielleicht mal ein Beispiel zeigen ?

    Unfassbar 👎
    Ist Dir nicht das Flag SND_ASYNCH aufgefallen?
    Lies doch einfach die PlaySound Doku...



  • ja doch doch, wie im thread schon beschrieben, habe ich es damit auch schon versucht, aber es kommt einfach kein ton raus !!!

    nur bei SND_SYNC hat es funktioniert, aber dann kann man es halt nicht unterbrechen!!!

    mfg aqua5748



  • kann mir den keiner mehr helfen, ich habe schon alles probiert was mir hier vorgeschlagen wurde und nichts davon hat funktioniert leider!

    mfg
    aqua5748



  • #include <stdio.h>
    #include <Windows.h>
    
    #pragma comment (lib, "Winmm.lib")
    
    int main()
    {
        PlaySound("sound.wav", 0, SND_ASYNC | SND_FILENAME | SND_LOOP | SND_NODEFAULT);
        getchar();
        return 0;
    }
    

    Falls das nicht funktioniert: Welchen Compiler nutzt du?
    Für alles Ernsthafte sollte man aber wohl auf eine externe Lösung zurückgreifen. Eine (wie ich finde) schöne Bibliothek wäre z.B. IrrKlang.



  • IrrKlang ist nicht gerade günstig. Aber ich muss zugeben, dass

    irrKlang Pro full (490€ Price excluding VAT: Depending on your location or company status, VAT may be added the price.)

    günstiger als

    FMOD (FMOD Commercial License, $ 3,000 USD)

    und

    BASS (Unlimited Commercial licence: €2750)

    sind.

    Ich würde einen einfachen MOD-Player empfehlen. Die gibt es wie Sand am Meer.



  • @cooky451,

    das was du geschrieben hast, hab ich auch schon versucht, hat leider aber nicht funktioniert...

    welcher compilier ich benutze weis ich nicht direkt!
    ich arbeite mit Microsoft Visual Studio 2005!

    dass was du geschrieben hast, habe ich versucht, es funktioniert nicht, es kommt eine Fehlermeldung:

    ": error C2664: 'PlaySoundW': Konvertierung des Parameters 1 von 'const char [19]' in 'LPCWSTR' nicht möglich. Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat."

    mfg
    aqua5748



  • Beschäftige Dich mal mit TCHAR oder verwende PlaySoundA anstelle von PlaySound...



  • ShadowTurtle schrieb:

    IrrKlang ist nicht gerade günstig.
    [..]
    Ich würde einen einfachen MOD-Player empfehlen. Die gibt es wie Sand am Meer.

    IrrKlang ist für nicht-kommerzielle Anwendungen kostenlos.

    @aqua5748
    Du versuchst das als Unicode-Code zu kompilieren. Schalte auf Multibyte um. (Du könntest z.B. einfach ein "neues leeres Projekt" anlegen.)
    Oder du rufst explizit PlaySoundA() auf.
    Oder du machst aus dem Parameter einen unicode String.



  • ok jetzt funktioniert es, danke 🙂

    was bewirkt die funktion getchar() ?

    mfg
    aqua5748



  • Es wartet bis Du eine Taste drückst.... aber am einfachsten ist immer noch die Doku zu lesen...


Anmelden zum Antworten