Tuesday, March 30, 2010

Firefox extension programming: play sound


A Firefox extension can play sound with the nsISound interface. In my next release of the extension Take A Break, I will add the sound to remind the user of a break. The interface is very easy to use.

1. Create a sound instance.
   sound = Components.classes["@mozilla.org/sound;1"]
            .createInstance(Components.interfaces.nsISound);
2. Beep.
   sound.beep();
That is how simple it can be. The Take A Break extension beeps every 3 seconds during the short break -- while the icon is flashing. So the user can close his/her eyes for a rest. When the beeping stops, the user can know the short break is over.

To do beeping every 3 seconds, we use the setTimeout() function. First, define a function doBeep().
   function doBeep()
   {
      if (sound)   // the "sound" instance we created
      {
         // Get the current time in milli-seconds.
         var currentTimeMs = (new Date()).getTime();

         // flashEndTimeMs tells when the short break will finish.
         // flashEndTimeMs was set before this function is called.
         if (currentTimeMs > flashEndTimeMs)
         {
            // Flashing ends. Stop beeping.
            beepTimer = null;
            return;
         }

         sound.beep();

         // restart timer.
         // After 3 seconds, this function is called back again.
         beepTimer = window.setTimeout(function(){ doBeep(); },
                        3000);   // 3 seconds
      }
   }
As you can see, inside the function doBeep(), we register itself as a callback function for the 3 seconds timeout event. So doBeep() runs every 3 seconds until the short break ends.

Secondly, when it is time for the short break, we call the function doBeep() to start the first beeping.
   // Set the end time for the short break.
   var currentTimeMs = (new Date()).getTime();
   flashEndTimeMs = secOfFlash * 1000 + currentTimeMs;

   // Start flashing and beeping.
   doFlash();
   doBeep();
This feature will be released in version 1.1 of Take A Break. The sample code here is modified a little to make it more understandable.

1 comment:

Tom said...

nsISound won't give you cross-platform browser compatibility. For example, good luck relying on nsISound to play a WAV file on Linux.

 
Get This <