ALSA playback question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi There,

I compiled and run a simply playback example that is found in the
following url, and it records/plays back ok in my linux,

http://www.linuxjournal.com/article/6735?page=0,1

This examples demos shows writing 5 secs of binary data to PCM device
to playback. If I have a raw audio file that is recored by a simple
record example, and I do not know the length of the binary audio file,
how would I control the loop ? How many loops are need? Thanks!

Code is posted here:

/*

This example reads standard from input and writes
to the default PCM device for 5 seconds of data.

*/

/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API

#include <alsa/asoundlib.h>

int main() {
 long loops;
 int rc;
 int size;
 snd_pcm_t *handle;
 snd_pcm_hw_params_t *params;
 unsigned int val;
 int dir;
 snd_pcm_uframes_t frames;
 char *buffer;

 /* Open PCM device for playback. */
 rc = snd_pcm_open(&handle, "default",
                   SND_PCM_STREAM_PLAYBACK, 0);
 if (rc < 0) {
   fprintf(stderr,
           "unable to open pcm device: %s\n",
           snd_strerror(rc));
   exit(1);
 }

 /* Allocate a hardware parameters object. */
 snd_pcm_hw_params_alloca(&params);

 /* Fill it in with default values. */
 snd_pcm_hw_params_any(handle, params);

 /* Set the desired hardware parameters. */

 /* Interleaved mode */
 snd_pcm_hw_params_set_access(handle, params,
                     SND_PCM_ACCESS_RW_INTERLEAVED);

 /* Signed 16-bit little-endian format */
 snd_pcm_hw_params_set_format(handle, params,
                             SND_PCM_FORMAT_S16_LE);

 /* Two channels (stereo) */
 snd_pcm_hw_params_set_channels(handle, params, 2);

 /* 44100 bits/second sampling rate (CD quality) */
 val = 44100;
 snd_pcm_hw_params_set_rate_near(handle, params,
                                 &val, &dir);

 /* Set period size to 32 frames. */
 frames = 32;
 snd_pcm_hw_params_set_period_size_near(handle,
                             params, &frames, &dir);

 /* Write the parameters to the driver */
 rc = snd_pcm_hw_params(handle, params);
 if (rc < 0) {
   fprintf(stderr,
           "unable to set hw parameters: %s\n",
           snd_strerror(rc));
   exit(1);
 }

 /* Use a buffer large enough to hold one period */
 snd_pcm_hw_params_get_period_size(params, &frames,
                                   &dir);
 size = frames * 4; /* 2 bytes/sample, 2 channels */
 buffer = (char *) malloc(size);

 /* We want to loop for 5 seconds */
 snd_pcm_hw_params_get_period_time(params,
                                   &val, &dir);
 /* 5 seconds in microseconds divided by
  * period time */
 loops = 5000000 / val;

 while (loops > 0) {
   loops--;
   rc = read(0, buffer, size);
   if (rc == 0) {
     fprintf(stderr, "end of file on input\n");
     break;
   } else if (rc != size) {
     fprintf(stderr,
             "short read: read %d bytes\n", rc);
   }
   rc = snd_pcm_writei(handle, buffer, frames);
   if (rc == -EPIPE) {
     /* EPIPE means underrun */
     fprintf(stderr, "underrun occurred\n");
     snd_pcm_prepare(handle);
   } else if (rc < 0) {
     fprintf(stderr,
             "error from writei: %s\n",
             snd_strerror(rc));
   }  else if (rc != (int)frames) {
     fprintf(stderr,
             "short write, write %d frames\n", rc);
   }
 }

 snd_pcm_drain(handle);
 snd_pcm_close(handle);
 free(buffer);

 return 0;
}

Thanks~

Xiaofeng Li

------------------------------------------------------------------------------
Using storage to extend the benefits of virtualization and iSCSI
Virtualization increases hardware utilization and delivers a new level of
agility. Learn what those decisions are and how to modernize your storage 
and backup environments for virtualization.
http://www.accelacomm.com/jaw/sfnl/114/51434361/
_______________________________________________
Alsa-user mailing list
Alsa-user@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-user


[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux