Hi,

I have modified an example programm of the alsa website, in fact
to test reading a wave file.

The behaviour of my program is very strange !
It works fine, the sample is played until the end, except when
I change virtual screen in Window Maker !! When i do it,
the program exit without error before the end of the sample.

Very strange ....

Is there something wrong in the program ?

This is the source code :




#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>


#define TAILLE 4000000

snd_pcm_t *sound_handle;
snd_output_t *errlog;
snd_pcm_hw_params_t *hwparams;

char *buffer;
int desc;
int n;
int main(void)
{
  int err;
  
  // Connect error reporting to stderr
  
  snd_output_stdio_attach(&errlog, stderr, 0);    
  
  if (snd_pcm_open(&sound_handle, "hw:0,0", SND_PCM_STREAM_PLAYBACK, 0)
< 0) 
    {
      fprintf(stderr, "AIE ! Error opening hw:0,0\n");
      snd_output_close(errlog);
      return 1;
    }
  
  // Set up the hardware device for 16-bit, 44KHZ, stereo
  
  // First initialize the hwparams struct using the sound_handle
  // we got for our sound hardware
  
  snd_pcm_hw_params_alloca(&hwparams);
  err = snd_pcm_hw_params_any(sound_handle, hwparams);
  if (err < 0)
    goto _alsa_error;
  
  // Now request the desired parameters one by one
  
  // Access method, interleaved or non-interleaved
  
  err = snd_pcm_hw_params_set_access(sound_handle, hwparams,
                                     SND_PCM_ACCESS_RW_INTERLEAVED);
  if (err < 0)
    goto _alsa_error;
  
  // The sample format, signed 16-bit little endian
  
  err = snd_pcm_hw_params_set_format(sound_handle, hwparams,
                                     SND_PCM_FORMAT_S16_LE);
  if (err < 0)
    goto _alsa_error;
  
  // The sample rate
  
  err = snd_pcm_hw_params_set_rate(sound_handle, hwparams,
                                   44100, 0);
  if (err < 0)
    goto _alsa_error;
  
  // Number of channels we want, stereo = 2
  
  err = snd_pcm_hw_params_set_channels(sound_handle, hwparams, 2);
  if (err < 0)
    goto _alsa_error;
  
  // The period size. For all practical purposes this is synonymous 
  // to OSS/Free's fragment size.
  // Note that this in frames (frame = nr_channels * sample_width)
  // So a value of 1024 means 4096 bytes (1024 x 2 x 16-bits)
  
  err = snd_pcm_hw_params_set_period_size(sound_handle, hwparams, 
                                          1024, 0);
  if (err < 0)
    goto _alsa_error;
  
  // The number of periods we want to allocate, 4 is reasonable
  
  err = snd_pcm_hw_params_set_periods(sound_handle, hwparams, 4, 0);
  if (err  < 0)
    goto _alsa_error;
  
  // Finally setup our hardware with the selected values
  
  err = snd_pcm_hw_params(sound_handle, hwparams);
  if (err < 0) {
    fprintf(stderr, "Unable to set hardware parameter:\n");
    snd_pcm_hw_params_dump(hwparams, errlog);
    return 2;
  }       
  fprintf(stdout, "Success!\n");  

  
  buffer = malloc(TAILLE);
  
  desc = open("dj.wav", O_RDONLY);

  read(desc, buffer, TAILLE);

  printf("Debut de la lecture\n");
  n = snd_pcm_writei(sound_handle, buffer, TAILLE);

  printf("Retour : %d\n", n);
  printf("Fin de la lecture\n");

 
  snd_pcm_close(sound_handle);
  snd_output_close(errlog);
  return 0;
  
 _alsa_error:            
  fprintf(stderr, "Invalid hardware parameter for device:\n");
  snd_pcm_hw_params_dump(hwparams, errlog);
  snd_pcm_close(sound_handle);
  snd_output_close(errlog);
  return 1;
}



Thanks


 
______________________________________________________________________________
ifrance.com, l'email gratuit le plus complet de l'Internet !
vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
http://www.ifrance.com/_reloc/email.emailif



_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to