All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juan Carlos Castro y Castro <jcastro@instant.com.br>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@lists.sourceforge.net
Subject: Re: Another asinine question
Date: Tue, 16 May 2006 13:28:23 -0300	[thread overview]
Message-ID: <4469FDA7.2090105@instant.com.br> (raw)
In-Reply-To: <s5hu07q2fx7.wl%tiwai@suse.de>

[-- Attachment #1: Type: text/plain, Size: 775 bytes --]

Takashi Iwai wrote:

>Juan Carlos Castro y Castro wrote:
>  
>
>>By the way, my pcm_file extensions DO work! It's the "plug" plugin 
>>that's not passing the reads! Stay tuned...
>>    
>>
>Great, feel free to submit the patches to alsa-devel ML (Cc to me).
>
Your wish is my command, Takashi-san. ;)

Note the interleaved read has not yet been implemented. Also, I'm not 
yet dealing with blocking versus non-blocking at the moment. When 
reading from a file, read()'s just keep getting zero bytes and arecord 
doesn't mind. Some deal of sophistication will have to be added.

Another thing: you'll see I just "hung" another snd_pcm_file_t structure 
at the bottom of the original one. I'll understand if that offends 
people's coding sensibilities -- it offended mine. :-/

[-- Attachment #2: pcm_file-infile.patch --]
[-- Type: text/x-patch, Size: 5166 bytes --]

diff -r 33b6942ac42d src/pcm/pcm_file.c
--- a/src/pcm/pcm_file.c	Fri Apr 28 15:55:32 2006 +0200
+++ b/src/pcm/pcm_file.c	Tue May 16 13:21:12 2006 -0300
@@ -42,7 +42,7 @@ typedef enum _snd_pcm_file_format {
 	SND_PCM_FILE_FORMAT_RAW
 } snd_pcm_file_format_t;
 
-typedef struct {
+typedef struct snd_pcm_file_t_struct {
 	snd_pcm_generic_t gen;
 	char *fname;
 	int fd;
@@ -55,6 +55,7 @@ typedef struct {
 	char *wbuf;
 	snd_pcm_channel_area_t *wbuf_areas;
 	size_t buffer_bytes;
+	struct snd_pcm_file_t_struct *nextfile;
 } snd_pcm_file_t;
 
 #endif /* DOC_HIDDEN */
@@ -120,6 +121,14 @@ static int snd_pcm_file_close(snd_pcm_t 
 		free((void *)file->fname);
 		close(file->fd);
 	}
+	if (file->nextfile) {
+		if (file->nextfile->fname) {
+			free((void *)file->nextfile->fname);
+			close(file->nextfile->fd);
+		}
+		free(file->nextfile);
+		file->nextfile = NULL;
+	}
 	return snd_pcm_generic_close(pcm);
 }
 
@@ -222,10 +231,20 @@ static snd_pcm_sframes_t snd_pcm_file_re
 {
 	snd_pcm_file_t *file = pcm->private_data;
 	snd_pcm_channel_area_t areas[pcm->channels];
-	snd_pcm_sframes_t n = snd_pcm_readi(file->gen.slave, buffer, size);
-	if (n > 0) {
-		snd_pcm_areas_from_buf(pcm, areas, buffer);
-		snd_pcm_file_add_frames(pcm, areas, 0, n);
+	snd_pcm_sframes_t n /* , bytesn */;
+
+	if (file->nextfile) {
+		n = /* bytesn = */ read(file->nextfile->fd, buffer, size * pcm->frame_bits / 8);
+		if (n > 0)
+			n = n * 8 / pcm->frame_bits;
+		/* SNDERR("DEBUG: channels = %d, sample_bits = %d, frame_bits = %d, bytes = %d, frames = %d",
+		        pcm->channels, pcm->sample_bits, pcm->frame_bits, bytesn, n); */
+	} else {
+		n = snd_pcm_readi(file->gen.slave, buffer, size);
+		if (n > 0) {
+			snd_pcm_areas_from_buf(pcm, areas, buffer);
+			snd_pcm_file_add_frames(pcm, areas, 0, n);
+		}
 	}
 	return n;
 }
@@ -234,7 +253,14 @@ static snd_pcm_sframes_t snd_pcm_file_re
 {
 	snd_pcm_file_t *file = pcm->private_data;
 	snd_pcm_channel_area_t areas[pcm->channels];
-	snd_pcm_sframes_t n = snd_pcm_writen(file->gen.slave, bufs, size);
+	snd_pcm_sframes_t n;
+
+	if (file->nextfile) {
+		SNDERR("DEBUG: Noninterleaved read not yet implemented.\n");
+		return 0;	/* Noninterleaved read not yet implemented */
+	}
+
+	n = snd_pcm_readn(file->gen.slave, bufs, size);
 	if (n > 0) {
 		snd_pcm_areas_from_bufs(pcm, areas, bufs);
 		snd_pcm_file_add_frames(pcm, areas, 0, n);
@@ -377,11 +403,11 @@ static snd_pcm_fast_ops_t snd_pcm_file_f
  *          changed in future.
  */
 int snd_pcm_file_open(snd_pcm_t **pcmp, const char *name,
-		      const char *fname, int fd, const char *fmt, int perm,
-		      snd_pcm_t *slave, int close_slave)
+		      const char *fname, int fd, const char *ifname, int ifd, 
+		      const char *fmt, int perm, snd_pcm_t *slave, int close_slave)
 {
 	snd_pcm_t *pcm;
-	snd_pcm_file_t *file;
+	snd_pcm_file_t *file, *ifile;
 	snd_pcm_file_format_t format;
 	int err;
 	assert(pcmp);
@@ -395,7 +421,7 @@ int snd_pcm_file_open(snd_pcm_t **pcmp, 
 	if (fname) {
 		fd = open(fname, O_WRONLY|O_CREAT, perm);
 		if (fd < 0) {
-			SYSERR("open %s failed", fname);
+			SYSERR("open %s for writing failed", fname);
 			return -errno;
 		}
 	}
@@ -405,7 +431,34 @@ int snd_pcm_file_open(snd_pcm_t **pcmp, 
 			close(fd);
 		return -ENOMEM;
 	}
-	
+
+	if (ifname) {
+		ifd = open(ifname, O_RDONLY);
+		if (ifd < 0) {
+			SYSERR("open %s for reading failed", ifname);
+			if (fname)
+				close(fd);
+			return -errno;
+		}
+	}
+	if (ifd) {
+		ifile = calloc(1, sizeof(snd_pcm_file_t));
+		if (!ifile) {
+			if (ifname)
+				close(ifd);
+			if (fname)
+				close(fd);
+			return -ENOMEM;
+		}
+		if (ifname)
+			ifile->fname = strdup(ifname);
+		ifile->fd = ifd;
+		ifile->format = format;
+		ifile->gen.slave = slave;		/* Do I really have to do this? */
+		ifile->gen.close_slave = close_slave;	/* And this?                    */
+		file->nextfile = ifile;
+	}
+
 	if (fname)
 		file->fname = strdup(fname);
 	file->fd = fd;
@@ -486,9 +539,9 @@ int _snd_pcm_file_open(snd_pcm_t **pcmp,
 	int err;
 	snd_pcm_t *spcm;
 	snd_config_t *slave = NULL, *sconf;
-	const char *fname = NULL;
+	const char *fname = NULL, *ifname = NULL;
 	const char *format = NULL;
-	long fd = -1;
+	long fd = -1, ifd = -1;
 	int perm = 0600;
 	snd_config_for_each(i, next, conf) {
 		snd_config_t *n = snd_config_iterator_entry(i);
@@ -513,6 +566,17 @@ int _snd_pcm_file_open(snd_pcm_t **pcmp,
 			err = snd_config_get_string(n, &fname);
 			if (err < 0) {
 				err = snd_config_get_integer(n, &fd);
+				if (err < 0) {
+					SNDERR("Invalid type for %s", id);
+					return -EINVAL;
+				}
+			}
+			continue;
+		}
+		if (strcmp(id, "infile") == 0) {
+			err = snd_config_get_string(n, &ifname);
+			if (err < 0) {
+				err = snd_config_get_integer(n, &ifd);
 				if (err < 0) {
 					SNDERR("Invalid type for %s", id);
 					return -EINVAL;
@@ -556,7 +620,7 @@ int _snd_pcm_file_open(snd_pcm_t **pcmp,
 	snd_config_delete(sconf);
 	if (err < 0)
 		return err;
-	err = snd_pcm_file_open(pcmp, name, fname, fd, format, perm, spcm, 1);
+	err = snd_pcm_file_open(pcmp, name, fname, fd, ifname, ifd, format, perm, spcm, 1);
 	if (err < 0)
 		snd_pcm_close(spcm);
 	return err;

  reply	other threads:[~2006-05-16 16:28 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-12 15:06 Another asinine question Juan Carlos Castro y Castro
2006-05-16 13:38 ` Takashi Iwai
2006-05-16 14:33   ` Juan Carlos Castro y Castro
2006-05-16 14:38     ` Takashi Iwai
2006-05-16 16:28       ` Juan Carlos Castro y Castro [this message]
2006-05-17 13:26         ` Takashi Iwai
2006-05-16 18:44     ` Juan Carlos Castro y Castro
2006-05-16 15:52   ` Error compiling alsa-driver from sources Juan Carlos Castro y Castro
2006-05-16 15:56     ` Takashi Iwai
2006-05-16 18:33       ` Juan Carlos Castro y Castro
  -- strict thread matches above, loose matches on Subject: below --
2006-05-17 14:48 Another asinine question Juan Carlos Castro y Castro
2006-05-17 15:24 ` Takashi Iwai
2006-05-17 16:22   ` Juan Carlos Castro y Castro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4469FDA7.2090105@instant.com.br \
    --to=jcastro@instant.com.br \
    --cc=alsa-devel@lists.sourceforge.net \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.