NW   NE
 

Sharp Zaurus Developer Information

Corrections and Comments: Spencer Huang
 
SW   SE
NW   NE
 
Howtos

Upgrading The ROM

Connectivity
Wireless 802.11b

Linux Connectivity
Generic (USB)
Debian (USB)
Red Hat (USB)
Suse (USB)
Mandrake (USB)
Generic (PPP USB)
Generic (PPP Serial)

Windows Connectivity
Win2K (Serial)
Win98se (Serial)
WinMe Over (Serial)
WinNTSP6 (Serial)
WinXP Over (Serial)

Developing
Compiler Setup
Compiling the Kernel
Special Considerations
Checklist
System Layout
Application Help Files
IPKG Howto
Buzzer Howto
Led Howto
IrDa Howto
Audio Howto
Fullscreen Howto
Resume Event
Keys
Turning off the screen

Syncing
Linux
Win2K
Wireless

Other
Wireless Comparison
The Z Boot Process
Ipv6 Setup
Servers Setup
SD And CF FAQ
Setting Up A Feed
Converting TTF fonts
Building a ROM
MPEG Encoding

Downloads
ZaurusZone Feed
Links
 
SW   SE
NW   NE
  Zaurus audio development howto:
by L.J. Potter

To get brief audio device info: run this command from the console:
# cat /dev/sndstat



The VERY easiest way to play sound is to use use cat command such as this:
# cat myNewSound >/dev/dsp

    or in a program, use system()
    system( "cat myNewSound >/dev/dsp");

The VERY easiest way to record sound is to use use cat command such as this:
# cat /dev/dsp1 >myNewSound

    or in a program, use system()
    system( "cat /dev/dsp1 >myNewSound");

This is not the most elegant way to do this.



The next easiest way to play audio is to use QSound:
The benefits are that you should be able to play more than one sound at a time.
*NOTE: there is no QSound::record()

#include <qsound.h>
#include <qpe/resource.h>

    QSound::play( Resource::findSound("ohdear") );

* NOTE: There is a bug on the Zaurus with QSound not being able to play sounds
shorter than about 8k.



or if you can use Qtopia's Sound class to loop sounds:
(there's no docs, so grab the qtopia cvs at sourceforge
and look in the source)

#include <qpe/sound.h>
#include <qpe/resource.h>

    Sound::soundAlarm();

or something like:

     Sound mySound( Resource::findSound("ohdear") );
    mySound.playLoop();

    mySound.stop();

* NOTE: There is a bug on the Zaurus with QSound not being able to play sounds
shorter than about 8k.



Using oss with the Zaurus:

Playing sounds:
-----------------

#include <sys/ioctl.h>
#include <linux/soundcard.h>

    int speed = 44100;
    int channels = 2;
    int format = AFMT_S16_LE; // or AFMT_U8, but has buggy output on the Z
    int dsp=0;
    signed short soundBuffer[1024];

    dsp = ::open("/dev/dsp", O_WRONLY);
        if( dsp == -1)  {
       perror("open(\"/dev/dsp\")");
       return;
        }

    // this is assuming you know what the format of the wav file is.
    // otherwise you'd have to read the header file first.

    if( ioctl( dsp, SNDCTL_DSP_SETFMT , &format)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
        return -1;
    }
    if( ioctl( dsp, SNDCTL_DSP_CHANNELS , &channels)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
        return -1;
    }
    if( ioctl( dsp, SNDCTL_DSP_SPEED , &speed)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_SPEED\")");
        return -1;
    }


  QFile track( "/opt/QtPalmtop/sounds/somesound.wav" );

  if( !track.open( IO_ReadOnly )) {
  QMessageBox:message("Sounds","There was an error opening the wav file");
    return -1;
  }

  int oldStyleFileHandle = track.handle();

    int length;
    while( !track.atEnd()) {
    length = ::read( oldStyleFileHandle, soundBuffer, 1024 ); //read from the file
    ::write( dsp, soundBuffer, length); //write to the device
    }

    ::close (dsp);
    track.close();



To record:
-----------

#include <sys/ioctl.h>
#include <linux/soundcard.h>

    int speed = 22050;
    int channels = 1;
//  *NOTE* the Zaurus input is ONLY mono !!

    int format = AFMT_S16_LE;
    int dsp=0;
    signed short soundBuffer[1024];

    dsp = ::open("/dev/dsp1", O_RDONLY);

// *NOTE* the Zaurus has a nonstandard input
// so /dev/dsp1 must be opened when
// recording


        if( dsp == -1)  {
       perror("open(\"/dev/dsp\")");
       return;
        }

    // this is assuming you know what the format of the wav file is.
    // otherwise you'd have to read the header file first.

    if( ioctl( dsp, SNDCTL_DSP_SETFMT , &format)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
        return -1;
    }
    if( ioctl( dsp, SNDCTL_DSP_CHANNELS , &channels)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
        return -1;
    }
    if( ioctl( dsp, SNDCTL_DSP_SPEED , &speed)==-1)  {
        perror("ioctl(\"SNDCTL_DSP_SPEED\")");
        return -1;
    }

  QFile track( "/opt/QtPalmtop/sounds/myNewSound.wav" );

  if( !track.open( IO_WriteOnly | IO_Truncate )) {
  QMessageBox:message("Sounds","There was an error opening the wav file");
    return -1;
  }

  int oldStyleFileHandle = track.handle();

    int length;
    while( 1) {  // or some other way to stop this crazy thing

    length = ::read( dsp, soundBuffer, 1024 ); //read from the file
    ::write(  oldStyleFileHandle, soundBuffer, length); //write to the device
    }

    ::close (dsp);
    track.close();

// to make a standard wav file, you would need to write
// a header before you start writing from the device, and then
// write to the header after you finish



For more information about programming OSS, visit:
http://www.opensound.com

 
SW   SE

    This page was last updated: Wednesday, 09-Apr-2003 04:57:10 PDT