#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#define BUF_BYTES 128
 
int main (/*int argc, char *argv[]*/) {
	int err;
	unsigned char buf_right[BUF_BYTES];
	unsigned char buf_left[BUF_BYTES];
	 //char *buf;
	int size;

	snd_pcm_t *playback_handle_right;
	snd_pcm_t *capture_handle_right;
	
	snd_pcm_t *playback_handle_left;
	snd_pcm_t *capture_handle_left;


#if 0	
	char* device = "default";
	if (argc > 1) device = argv[1];
#endif
	char* crdevice = "VINR";

	char* prdevice = "VOUTR";

	char* cldevice = "VINL";

	char* pldevice = "VOUTL";


//	unsigned int rate = 48000;
	unsigned int rate = 8000;
	unsigned int nchannels = 1;
	snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
	unsigned int buf_frames_right = BUF_BYTES / nchannels / 2;
	unsigned int buf_frames_left = BUF_BYTES / nchannels / 2;

///// RIGHT CHANNEL 
	if ((err = snd_pcm_open (&playback_handle_right, prdevice, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
	fprintf (stderr, "cannot open playback right audio device %s (%s)\n", prdevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Playback right audio device  successfully %s \n", prdevice);
	}
	
	if ((err = snd_pcm_set_params(playback_handle_right, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "Playback right open error: %s\n", snd_strerror(err)); exit(1);
	}

	if ((err = snd_pcm_open (&capture_handle_right, crdevice, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
	fprintf (stderr, "cannot open capture right audio device %s (%s)\n", crdevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Capture right audio device successfully %s \n", crdevice);
	}

	if ((err = snd_pcm_set_params(capture_handle_right, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "capture right open error: %s\n", snd_strerror(err)); exit(1);
	}	

////LEFT CHANNEL
	if ((err = snd_pcm_open (&playback_handle_left, pldevice, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
	fprintf (stderr, "cannot open playback left audio device %s (%s)\n", pldevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Playback left audio device successfully %s \n", pldevice);
	}
	
	if ((err = snd_pcm_set_params(playback_handle_left, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "Playback left open error: %s\n", snd_strerror(err)); exit(1);
	}

	if ((err = snd_pcm_open (&capture_handle_left, cldevice, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
	fprintf (stderr, "cannot open capture left audio device %s (%s)\n", cldevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Capture left audio device successfully %s \n", crdevice);
	}

	if ((err = snd_pcm_set_params(capture_handle_left, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "capture left open error: %s\n", snd_strerror(err)); exit(1);
	}



	while(1) {
///// RIGHT CHANNEL 
		if ((err = snd_pcm_readi (capture_handle_right, buf_right, buf_frames_right)) != buf_frames_right) {
		fprintf (stderr, "read from audio interface right failed (%s)\n", snd_strerror (err)); exit (1);
		}	

		if ((err = snd_pcm_writei (playback_handle_right, buf_right, buf_frames_right)) != buf_frames_right) {
		fprintf (stderr, "write to audio interface right failed (%s)\n", snd_strerror (err)); exit (1);
		}
////LEFT CHANNEL
		if ((err = snd_pcm_readi (capture_handle_left, buf_left, buf_frames_left)) != buf_frames_left) {
		fprintf (stderr, "read from audio interface left failed (%s)\n", snd_strerror (err)); exit (1);
		}	

		if ((err = snd_pcm_writei (playback_handle_left, buf_left, buf_frames_left)) != buf_frames_left) {
		fprintf (stderr, "write to audio interface left failed (%s)\n", snd_strerror (err)); exit (1);
		}

	}
 
	fprintf (stderr, "close handles\n");
	snd_pcm_close (playback_handle_right);
	snd_pcm_close (capture_handle_right);

	snd_pcm_close (playback_handle_left);
	snd_pcm_close (capture_handle_left);

	return 0;
} 
