Link to home
Start Free TrialLog in
Avatar of digi_mind
digi_mind

asked on

How to play a sound in the shell ?

I have a very simple program running in the shell made in C++.

I want this program to be able to play a sound when I prees "s". how and what class should I include ?

cin >> option;
if(option=="s")
   //play the .wav or what ever format I can play in the shell....


Thank you.
Avatar of stefan73
stefan73
Flag of Germany image

Hi digi_mind,
The simplest way is

system("start your_wav.wav");

...this will be like a doubleclick on the wav in Explorer.

Cheers,
Stefan
Avatar of digi_mind
digi_mind

ASKER

Do I need to include some class to use "system" ? because so far I have a file called email.wav, but it is not working... have a look:

#include <iostream>
using namespace std;
main()
{
   system("start /usr/share/sounds/email.wav");
}
For simple sounds...as in speaker beeps...

int main( int argc, char **argv )
{
      int i;

      for  (i=1; i < 5; i++)
              putchar(7);

      return 0;
}

for real audio as in .wav files or .mp3 files you need a library already built...
check out this one...writting in C++
http://osalp.sourceforge.net/

or use a cheater method...

fork() off a new process and call an already made audio program, and then when the child exists contil in your program....

#include <signal.h>
#include <iostream>
#define __USE_XOPEN 1
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;

int main( void )
{
   pid_t pid;
   int status, died;

   switch(pid=fork())
   {
       case -1: cout << "can't fork\n";
      exit(-1);
       case 0 : cout << "   I'm the child of PID " << getppid() << ".\n";
      cout << "   My PID is " <<  getpid() << endl;
      sleep(2);
      exit(3);
       default: cout << "I'm the parent.\n";
      cout << "My PID is " <<  getpid() << endl;
      // kill the child in 50% of runs
      if (pid & 1)
         kill(pid,SIGKILL);
      died= wait(&status);
      if(WIFEXITED(status))
         cout << "The child, pid=" << pid << ", has returned " << WEXITSTATUS(status) << endl;
      else
         cout << "The child process was sent a " << WTERMSIG(status) << " signal\n";
  }
   return 0;
}
use the man pages there are your friend

man system

NAME
       system - execute a shell command

SYNOPSIS
       #include  <stdlib.h>

       int  system  (const  char  *  string);

it bascially does what I showed you above.....
ASKER CERTIFIED SOLUTION
Avatar of stefan73
stefan73
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
digi_mind,
Errm... Wrong implication - you don't need Windows to play .wav

use "apropos sound" to get the appropriate tool. I only have Solaris here :-/

Stefan
If you have ALSA (and who doesn't these days :-) you can use the aplay command:

aplay /path/to/your/file.wav

... and you would put this command into the system() function, or use the fork() example from above.
or if mp3s then everyone should have mpg123
let me tell you all something... I never said windows. I said linux... no problem the code is so simple:

System("play music.wav");

Can I get my points refunded ?
every one of these examples is for linux....by windows they were meaning a window manager? like gnome? etc....

the system() call was a suggestion from stefan73 by which you didn't know about it, hence your next question...and then you got the it correct but I would venture to guess that means that stefan73 deserves the points....every linux distro has different default progs installed so hence all the various system() suggestions

just my .6 cents
Yes, Stefan73 will get the points. Agree with your help. Thank you