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;
next prev parent 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.