Hi !

I managed to capture sound but I have a problem due to the stereo. It is
impossible to capture data of channels separately.

I made a test for that : I have generated a sound with a square frequency of
2000 Hz in the left channel and a square frequency of 6000 Hz in the right
channel. And when I capture this sound I only have the sound of the right
channel : in the buffer I have the data of the right channel, but the data of
the left channel is replaced the right one.
I think that the stereo is taken only from the right channel (the signal is
exactly the same at the same time).

I join you the source of my program, if see the error...



#define BUF_SIZE 4096
#define ECHANT 44100
#define LASTING 10000

struct snd_card
{
  snd_pcm_t *handle;
  snd_pcm_hw_params_t *params;

  char *name;
  char *card_id;  

  short inputBuffer[BUF_SIZE*2];  
  void *buffer[2];
};

typedef struct snd_card snd_card_t;


/////////////////////////////////
// Assigns a card to the program
snd_card_t*
assign_card (int card)
{
  char card_id[32];
  int err;
  snd_card_t *returned_card;
  returned_card = calloc(1,sizeof(snd_card_t));

  // Initialize the buffer
  returned_card->buffer[0] = returned_card->inputBuffer;
  returned_card->buffer[1] = &returned_card->inputBuffer[BUF_SIZE];
  
  snprintf (card_id, 32, "plughw:%d", card);
  returned_card->card_id = strdup(card_id);

  // I removed the error handlers
  snd_pcm_open (&returned_card->handle, returned_card->card_id,
SND_PCM_STREAM_CAPTURE, 0);
  snd_pcm_hw_params_malloc (&returned_card->params);
  snd_pcm_hw_params_any (returned_card->handle, returned_card->params);
  //2 for the two channels for stereo
  snd_pcm_hw_params_set_channels (returned_card->handle, returned_card->params, 2);
  snd_pcm_hw_params_set_access (returned_card->handle, returned_card->params,
SND_PCM_ACCESS_RW_NONINTERLEAVED);
  snd_pcm_hw_params_set_format (returned_card->handle, returned_card->params,
SND_PCM_FORMAT_S16_LE);
  snd_pcm_hw_params_set_rate_near (returned_card->handle, returned_card->params,
ECHANT, 0);
  snd_pcm_hw_params (returned_card->handle, returned_card->params);
  snd_pcm_hw_params_free (returned_card->params);
  snd_pcm_prepare (returned_card->handle);
  return returned_card;
}


///////////////////////////////////////////////////// 
// Main 
int 
main (int argc, char *argv[]) 
{
  int i=0;
  int err;
  int card_number = 0;
  snd_card_t *card1;
 
  card1 = assign_card(card_number);

  for (i=0; i<LASTING; i++) 
  {
    err = snd_pcm_readn (card1->handle, card1->buffer, BUF_SIZE);
     
    if (err >= BUF_SIZE) 
    {
      // Write the content of the buffer into a file to examine the content
    } // End of treatment of the two channels
    else if (err == -EPIPE) 
    {     
      printf("Under-Run \n");
      // under-run 
      snd_pcm_prepare (card1->handle);
    } 
    else if (err == -ESTRPIPE) 
    {
      
      while ((err = snd_pcm_resume (card1->handle)) == -EAGAIN)
        sleep(1);       // wait until the suspend flag is released
        
      if (err < 0) 
        snd_pcm_prepare (card1->handle);  // prepare again to read
    }
  }
  
  snd_pcm_close (card1->handle);
  return 0;
}



And here is a very small part of the text file obtained, we see the data of left
channel is always the same as the right (altough the frequencies of each channel
are differents).

LEFT CHANNEL  ----   RIGHT CHANNEL
    
buff=25531    ----    25448
buff=29062    ----    29024
buff=28990    ----    28953
buff=25640    ----    25564
buff=27761    ----    27714
buff=-31412    ----    -31364
buff=-29466    ----    -29392
buff=-32110    ----    -32067
buff=-32600    ----    -32571
buff=30326    ----    30317
buff=28573    ----    28537
buff=30212    ----    30202
buff=31043    ----    31031
buff=28114    ----    28063
buff=32445    ----    32458



Cyril Coquilleau


-------------------------------------------------------
This SF.net email sponsored by: Enterprise Linux Forum Conference & Expo
The Event For Linux Datacenter Solutions & Strategies in The Enterprise 
Linux in the Boardroom; in the Front Office; & in the Server Room 
http://www.enterpriselinuxforum.com
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to