Un-top-posting and trying to regurgitate into a cohesive thread...

On Wed, 21 Jul 2010, Quy Pham Sy wrote:

I have to play a alaw file with .wav ext. How can I do this?

On Wed, 21 Jul 2010, Danny Nicholas wrote:

Asterisk won’t be “happy” trying to play foobar.wav if it is actually a .alaw file. Since you can’t rename the existing files, there’s no law that says you can’t copy them and play them correctly. Assuming that your calls are using the alaw codec, this snippet would do the trick

Exten => 1234,1,answer
Exten => 1234,n,System(/bin/cp foobar.wav /tmp/foobar.alaw)
Exten => 1234,n,playback(/tmp/foobar)
Exten => 1234,n,System(/bin/rm /tmp/foobar.alaw)

On Wed, 21 Jul 2010, Kevin P. Fleming wrote:

No, that won't work either, because a WAV file has a header, and a raw alaw file does not... so Asterisk will try to play the contents of that header as alaw data, presumably producing terrible noise.

The best you can do is to use sox to convert them from alaw-in-WAV-container to raw-alaw.

On Wed, 21 Jul 2010, Quy Pham Sy wrote:

>> Exten => 1234,n,System(/bin/cp foobar.wav /tmp/foobar.alaw)

it actually works, I made a link to the .wav file instead of copying it ln -s foobar.wav foobar.alaw, and it works well.

My .wav files are alaw file indeed. Here is the output from file command

$file 53.wav
53.wav: RIFF (little-endian) data, WAVE audio, ITU G.711 A-law, mono 8000 Hz

they've just named as xxx.wav so I guess there is no problems with copying or linking solutions.

It only "appears" to be working because you can't hear the problem.

Your files are not "mis-named," they are formatted in a way that Asterisk doesn't handle. Asterisk understands A-LAW encoding, just not when it's in a WAV "container."

(There is no such thing as an "alaw file." You may be thinking of a
raw (header-less) file containing A-LAW encoded data.)

By "tricking" Asterisk into playing the file as a header-less file, Asterisk is processing the WAV header as A-LAW encoded data. A WAV file has a 44 byte header. An A-LAW sample is 1 byte (not real sure about that). The sample rate is 8,000 per second. The 44 "samples" are played in about 1/200th of a second so you don't hear the "noise" at the beginning of the file.

You can create an "A-LAW in WAV" file using:

        sox\
                /var/lib/asterisk/sounds/demo-congrats.wav\
                -A\
                -t wav\
                alaw-in-wav.wav

If you extract the header using:

        dd\
                bs=44\
                count=1\
                if=alaw-in-wav.wav\
                of=header.wav

And then concatenate a bunch of them:

        for ((IDX = 0; IDX < 200; ++IDX))
        do
        cat header.wav
        done >noise.alaw

And then convert this into a "more normal" WAV file:

        sox -t al noise.alaw -s -w noise.wav

You can play this in most audio players and hear about 1 second of a not too annoying buzz.

The "proper" way to handle this would be to enhance format_wav.c/format_wav_gsm.c to handle A-LAW encoded data.

Another approach would be to write an AGI (playback-alaw-in-wav?) to "wrap" the create a link, play the file, delete the link band-aid. You could do in dialplan, I just prefer writing code where I have more flexibility and better error handling.

--
Thanks in advance,
-------------------------------------------------------------------------
Steve Edwards       [email protected]      Voice: +1-760-468-3867 PST
Newline                                              Fax: +1-760-731-3000
-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
New to Asterisk? Join us for a live introductory webinar every Thurs:
               http://www.asterisk.org/hello

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to