1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Sounddatei per Taste starten

Discussion in 'Programmieren' started by Helpi9000, May 18, 2008.

Thread Status:
Not open for further replies.
  1. Helpi9000

    Helpi9000 ROM

    Hallo,

    ich möchte eine Taste (einfacher Schalter) über den Seriellenanschluss an PC anschließen und möchte ein Programm programmieren das eine bestimmte Sounddatei (Wave oder mp3) abspielt sobald diese Taste gedrückt wird. Nur leider hab ich keine Ahnung vom Programmieren, weiß somit nicht mit was und wie ich das programmiere. Kann mir evtl jemand helfen?

    MfG
    Helpi9000
     
  2. RealC++

    RealC++ Kbyte

    Schaust du hier!
     
  3. Helpi9000

    Helpi9000 ROM

    Leider weiß ich jetzt damit gar nichts anzufangen. Wie gesagt ich hab nunmal keine Ahnung von Programmiersprachen.
     
  4. RealC++

    RealC++ Kbyte

    Ich habe das jetzt mal in C++ "heruntergecoded", wobei ich mir nicht sicher bin, ob ich im Teil mit der seriellen Schnittstelle keinen Fehler habe (nicht getestet).
    Ausserdem funktioniert es ausschliesslich mit MP3-Files, welche eine konstante Bitrate haben.
    Code:
    #include <windows.h>
    #include <conio.h>
    #include <iostream>
    #include <string>
    
    #define FILENAME_MP3 (std::string)"test.mp3"
    #define COM_NAME "COM1"
    
    class c_com
    {
      private:
    	HANDLE h;
    
      public:
    	c_com(void)
    	{
    		DCB interface_parameter;
    		COMMTIMEOUTS timeout_einstellungen;
    
    		this->h=CreateFileA(COM_NAME,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    
    		GetCommState(this->h,&interface_parameter);
    		interface_parameter.DCBlength=sizeof(interface_parameter);
    		interface_parameter.BaudRate=9600;
    		interface_parameter.ByteSize=8;
    		interface_parameter.StopBits=1;
    		interface_parameter.Parity=NOPARITY;
    		SetCommState(this->h,&interface_parameter);
    
    		timeout_einstellungen.ReadIntervalTimeout=100;
    		timeout_einstellungen.ReadTotalTimeoutMultiplier=100;
    		timeout_einstellungen.ReadTotalTimeoutConstant=100;
    		timeout_einstellungen.WriteTotalTimeoutMultiplier=100;
    		timeout_einstellungen.WriteTotalTimeoutConstant=100;
    		SetCommTimeouts(this->h,&timeout_einstellungen);
    
    		EscapeCommFunction(this->h,SETRTS);
    		EscapeCommFunction(this->h,CLRDTR);
    	}
    
    	~c_com(void)
    	{
    		CloseHandle(this->h);
    	}
    
    	bool cts(void)
    	{
    		DWORD s;
    		GetCommModemStatus(this->h,&s);
    
    		// So ist der COM1 mit einem Umschalter beschaltet:
    		// ========================================================
    		// RTS/Play  (>+5V) o------
    		//                        ''**--o CTS ("Sensor")
    		// DTR/Pause (<-5V) o------
    
    		if(MS_CTS_ON&s)
    		{
    			// Umschalter ist auf RTS.
    			return true;
    		}
    		else
    		{
    			// Umschalter ist auf DTR.
    			return false;
    		}
    	}
    }com;
    
    // Die Bibliothek "winmm.lib" wird
    // fuer mciSendStringA(...) benoetigt.
    #pragma comment(lib,"winmm.lib")
    
    class c_music
    {
      public:
    
    	  c_music(void)
    	  {
    		  mciSendStringA(("open \""+FILENAME_MP3+"\" alias mp3player shareable").c_str(),NULL,NULL,NULL);
    		  mciSendStringA("set mp3player time format milliseconds",NULL,NULL,NULL);
    	  }
    
    	  ~c_music(void)
    	  {
    		  mciSendStringA("stop mp3player", NULL, 0, NULL);
    		  mciSendStringA("close mp3player",NULL,NULL,NULL);
    	  }
    
    	  void play(void)
    	  {
    		  mciSendStringA("play mp3player",NULL,NULL,NULL);
    	  }
    
    	  void pause(void)
    	  {
    		  mciSendStringA("pause mp3player", NULL, 0, NULL);
    	  }
    }music;
    
    int main(void)
    {
    	std::cout<<"Druecken Sie Escape um das Programm zu beenden...";
    
    	// Der Dezimalwert 27 entspricht
    	// dem ASCII-Code fuer Escape.
    	while(!(_kbhit()&&_getch()==27))
    	{
    		if(com.cts())
    		{
    			music.play();
    		}
    		else
    		{
    			music.pause();
    		}
    	}
    }
    
    
     
    Last edited: May 18, 2008
  5. RealC++

    RealC++ Kbyte

    Ääääähhhhhhh... - SORRY!!!!, ich hab's dann wohl etwas "verkackt".

    So ist's richtig und funktionsfähig:
    (Allerdings wird die Möglichkeit der Steuerung über den COM1, erstmal noch nicht genutzt.)
    Code:
    #include <windows.h>
    #include <conio.h>
    #include <iostream>
    #include <string>
    
    #define FILENAME_MP3 (std::string)"test.mp3"
    #define COM_NAME "COM1"
    
    class c_com
    {
      private:
    	HANDLE h;
    
      public:
    	c_com(void)
    	{
    		DCB interface_parameter;
    		COMMTIMEOUTS timeout_einstellungen;
    
    		this->h=CreateFileA(COM_NAME,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    
    		GetCommState(this->h,&interface_parameter);
    		interface_parameter.DCBlength=sizeof(interface_parameter);
    		interface_parameter.BaudRate=9600;
    		interface_parameter.ByteSize=8;
    		interface_parameter.StopBits=1;
    		interface_parameter.Parity=NOPARITY;
    		SetCommState(this->h,&interface_parameter);
    
    		timeout_einstellungen.ReadIntervalTimeout=100;
    		timeout_einstellungen.ReadTotalTimeoutMultiplier=100;
    		timeout_einstellungen.ReadTotalTimeoutConstant=100;
    		timeout_einstellungen.WriteTotalTimeoutMultiplier=100;
    		timeout_einstellungen.WriteTotalTimeoutConstant=100;
    		SetCommTimeouts(this->h,&timeout_einstellungen);
    
    		EscapeCommFunction(this->h,SETRTS);
    		EscapeCommFunction(this->h,CLRDTR);
    	}
    
    	~c_com(void)
    	{
    		CloseHandle(this->h);
    	}
    
    	bool cts(void)
    	{
    		DWORD s;
    		GetCommModemStatus(this->h,&s);
    
    		// So ist der COM1 mit einem Umschalter beschaltet:
    		// ========================================================
    		// RTS/Play  (>+5V) o------
    		//                        ''**--o CTS ("Sensor")
    		// DTR/Pause (<-5V) o------
    
    		if(MS_CTS_ON&s)
    		{
    			// Umschalter ist auf RTS.
    			return true;
    		}
    		else
    		{
    			// Umschalter ist auf DTR.
    			return false;
    		}
    	}
    }com;
    
    // Die Bibliothek "winmm.lib" wird
    // fuer mciSendStringA(...) benoetigt.
    #pragma comment(lib,"winmm.lib")
    
    enum playerstate
    {
    	ps_play,
    	ps_stop,
    	ps_pause
    };
    
    class c_music
    {
      private:
    	  playerstate s;
    
      public:
    
    	  c_music(void)
    	  {
    		  this->stop();
    	  }
    
    	  ~c_music(void)
    	  {
    		  this->stop();
    	  }
    
    	  void play(void)
    	  {
    		  if(this->s!=ps_play){
    			  mciSendStringA(("open \""+FILENAME_MP3+"\" alias mp3player shareable").c_str(),NULL,NULL,NULL);
    			  mciSendStringA("set mp3player time format milliseconds",NULL,NULL,NULL);
    			  mciSendStringA("play mp3player",NULL,NULL,NULL);
    			  this->s=ps_play;
    		  }
    	  }
    
    	  void pause(void)
    	  {
    		  if(this->s!=ps_pause&&this->s==ps_play){
    			  mciSendStringA("pause mp3player",NULL,0,NULL);
    			  this->s=ps_pause;
    		  }
    		  else if(this->s==ps_pause)
    		  {
    			  this->play();
    		  }
    	  }
    
    	  void stop(void)
    	  {
    		  if(this->s!=ps_stop){
    			  mciSendStringA("stop mp3player",NULL,0,NULL);
    			  mciSendStringA("close mp3player",NULL,NULL,NULL);
    			  this->s=ps_stop;
    		  }
    	  }
    }music;
    
    int main(void)
    {
    	SetConsoleTitleA("MP3-PLAYER  -  VERSION 1.00");
    	std::cout
    		<<"<p> - PLAY"<<std::endl
    		<<"<s> - STOP"<<std::endl
    		<<"<b> - PAUSE"<<std::endl
    		<<"<q> - QUIT"<<std::endl
    		<<std::endl
    		<<FILENAME_MP3<<std::endl;
    
    	int i;
    	do{
    		while(!_kbhit());
    		i=_getch();
    		switch(i)
    		{
    			case 'p':
    				music.play();
    				break;
    			case 's':
    				music.stop();
    				break;
    			case 'b':
    				music.pause();
    				break;
    		}
    	}while(i!='q');
    }
    
    
     
    Last edited: May 18, 2008
Thread Status:
Not open for further replies.

Share This Page