Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18732

Modified Files:
        pcm.c pcm_dmix.c pcm_dshare.c pcm_dsnoop.c pcm_file.c 
        pcm_hooks.c pcm_hw.c pcm_local.h pcm_meter.c pcm_multi.c 
        pcm_null.c pcm_plugin.c pcm_rate.c pcm_share.c pcm_shm.c 
Log Message:
- added poll_ask callback to mangle avail_min (rate_plugin as example)
- added mangling of avail_min to rate_plugin
- added poll_fd_count variable
- FIXME: move poll_revents callback to fast_ops


Index: pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm.c,v
retrieving revision 1.277
retrieving revision 1.278
diff -u -r1.277 -r1.278
--- pcm.c       12 Mar 2004 19:07:20 -0000      1.277
+++ pcm.c       17 Mar 2004 11:48:14 -0000      1.278
@@ -1230,7 +1230,15 @@
  */
 int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
 {
+       int err;
+
        assert(pcm && pfds);
+       if (pcm->fast_ops->poll_ask) {
+               err = pcm->fast_ops->poll_ask(pcm->fast_op_arg);
+               if (err < 0)
+                       return err;
+       }
+       assert(pcm->poll_fd >= 0);
        if (space >= 1 && pfds) {
                pfds->fd = pcm->poll_fd;
                pfds->events = pcm->poll_events | POLLERR | POLLNVAL;
@@ -1255,7 +1263,7 @@
 {
        assert(pcm && pfds && revents);
        if (pcm->ops->poll_revents)
-               return pcm->ops->poll_revents(pcm, pfds, nfds, revents);
+               return pcm->ops->poll_revents(pcm->op_arg, pfds, nfds, revents);
        if (nfds == 1) {
                *revents = pfds->revents;
                return 0;
@@ -2008,6 +2016,8 @@
                pcm->name = strdup(name);
        pcm->stream = stream;
        pcm->mode = mode;
+       pcm->poll_fd_count = 1;
+       pcm->poll_fd = -1;
        pcm->op_arg = pcm;
        pcm->fast_op_arg = pcm;
        INIT_LIST_HEAD(&pcm->async_handlers);
@@ -2061,6 +2071,17 @@
        err_poll = poll(&pfd, 1, timeout);
        if (err_poll < 0)
                return -errno;
+#if 0 /* very useful code to test poll related problems */
+       {
+               snd_pcm_sframes_t delay, avail_update;
+               snd_pcm_hwsync(pcm);
+               avail_update = snd_pcm_avail_update(pcm);
+               if (avail_update < pcm->avail_min) {
+                       printf("*** snd_pcm_wait() FATAL ERROR!!!\n");
+                       printf("avail_min = %li, avail_update = %li\n", 
pcm->avail_min, avail_update);
+               }
+       }
+#endif
        err = snd_pcm_poll_descriptors_revents(pcm, &pfd, 1, &revents);
        if (err < 0)
                return err;

Index: pcm_dmix.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dmix.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- pcm_dmix.c  18 Feb 2004 20:15:49 -0000      1.52
+++ pcm_dmix.c  17 Mar 2004 11:48:14 -0000      1.53
@@ -766,6 +766,7 @@
        .rewind = snd_pcm_dmix_rewind,
        .forward = snd_pcm_dmix_forward,
        .resume = snd_pcm_dmix_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_mmap_writei,
        .writen = snd_pcm_mmap_writen,
        .readi = snd_pcm_dmix_readi,

Index: pcm_dshare.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dshare.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- pcm_dshare.c        23 Jan 2004 13:05:20 -0000      1.15
+++ pcm_dshare.c        17 Mar 2004 11:48:15 -0000      1.16
@@ -495,6 +495,7 @@
        .rewind = snd_pcm_dshare_rewind,
        .forward = snd_pcm_dshare_forward,
        .resume = snd_pcm_dshare_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_mmap_writei,
        .writen = snd_pcm_mmap_writen,
        .readi = snd_pcm_dshare_readi,

Index: pcm_dsnoop.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dsnoop.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- pcm_dsnoop.c        2 Mar 2004 17:13:50 -0000       1.17
+++ pcm_dsnoop.c        17 Mar 2004 11:48:15 -0000      1.18
@@ -463,6 +463,7 @@
        .rewind = snd_pcm_dsnoop_rewind,
        .forward = snd_pcm_dsnoop_forward,
        .resume = snd_pcm_dsnoop_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_dsnoop_writei,
        .writen = snd_pcm_dsnoop_writen,
        .readi = snd_pcm_mmap_readi,

Index: pcm_file.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_file.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -r1.62 -r1.63
--- pcm_file.c  8 Feb 2004 10:21:23 -0000       1.62
+++ pcm_file.c  17 Mar 2004 11:48:15 -0000      1.63
@@ -273,6 +273,14 @@
        return snd_pcm_resume(file->slave);
 }
 
+static int snd_pcm_file_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_file_t *file = pcm->private_data;
+       if (file->slave->fast_ops->poll_ask)
+               return file->slave->fast_ops->poll_ask(file->slave->fast_op_arg);
+       return 0;
+}
+
 static snd_pcm_sframes_t snd_pcm_file_writei(snd_pcm_t *pcm, const void *buffer, 
snd_pcm_uframes_t size)
 {
        snd_pcm_file_t *file = pcm->private_data;
@@ -467,6 +475,7 @@
        .rewind = snd_pcm_file_rewind,
        .forward = snd_pcm_file_forward,
        .resume = snd_pcm_file_resume,
+       .poll_ask = snd_pcm_file_poll_ask,
        .writei = snd_pcm_file_writei,
        .writen = snd_pcm_file_writen,
        .readi = snd_pcm_file_readi,

Index: pcm_hooks.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_hooks.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- pcm_hooks.c 23 Oct 2003 14:42:47 -0000      1.31
+++ pcm_hooks.c 17 Mar 2004 11:48:15 -0000      1.32
@@ -182,6 +182,14 @@
        return snd_pcm_resume(h->slave);
 }
 
+static int snd_pcm_hooks_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_hooks_t *h = pcm->private_data;
+       if (h->slave->fast_ops->poll_ask)
+               return h->slave->fast_ops->poll_ask(h->slave->fast_op_arg);
+       return 0;
+}
+
 static snd_pcm_sframes_t snd_pcm_hooks_writei(snd_pcm_t *pcm, const void *buffer, 
snd_pcm_uframes_t size)
 {
        snd_pcm_hooks_t *h = pcm->private_data;
@@ -315,6 +323,7 @@
        .rewind = snd_pcm_hooks_rewind,
        .forward = snd_pcm_hooks_forward,
        .resume = snd_pcm_hooks_resume,
+       .poll_ask = snd_pcm_hooks_poll_ask,
        .writei = snd_pcm_hooks_writei,
        .writen = snd_pcm_hooks_writen,
        .readi = snd_pcm_hooks_readi,

Index: pcm_hw.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_hw.c,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- pcm_hw.c    5 Mar 2004 08:05:21 -0000       1.123
+++ pcm_hw.c    17 Mar 2004 11:48:15 -0000      1.124
@@ -872,6 +872,7 @@
        .rewind = snd_pcm_hw_rewind,
        .forward = snd_pcm_hw_forward,
        .resume = snd_pcm_hw_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_hw_writei,
        .writen = snd_pcm_hw_writen,
        .readi = snd_pcm_hw_readi,

Index: pcm_local.h
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_local.h,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -r1.132 -r1.133
--- pcm_local.h 8 Feb 2004 10:20:02 -0000       1.132
+++ pcm_local.h 17 Mar 2004 11:48:15 -0000      1.133
@@ -149,6 +149,7 @@
        int (*hwsync)(snd_pcm_t *pcm);
        int (*delay)(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp);
        int (*resume)(snd_pcm_t *pcm);
+       int (*poll_ask)(snd_pcm_t *pcm);
        snd_pcm_sframes_t (*rewind)(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
        snd_pcm_sframes_t (*forward)(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
        snd_pcm_sframes_t (*writei)(snd_pcm_t *pcm, const void *buffer, 
snd_pcm_uframes_t size);
@@ -165,6 +166,7 @@
        snd_pcm_type_t type;
        snd_pcm_stream_t stream;
        int mode;
+       int poll_fd_count;
        int poll_fd;
        unsigned short poll_events;
        int setup;

Index: pcm_meter.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_meter.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- pcm_meter.c 25 Jul 2003 17:02:03 -0000      1.43
+++ pcm_meter.c 17 Mar 2004 11:48:15 -0000      1.44
@@ -411,6 +411,14 @@
        return snd_pcm_resume(meter->slave);
 }
 
+static int snd_pcm_meter_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_meter_t *meter = pcm->private_data;
+       if (meter->slave->fast_ops->poll_ask)
+               return meter->slave->fast_ops->poll_ask(meter->slave->fast_op_arg);
+       return 0;
+}
+
 static snd_pcm_sframes_t snd_pcm_meter_mmap_commit(snd_pcm_t *pcm,
                                                   snd_pcm_uframes_t offset,
                                                   snd_pcm_uframes_t size)
@@ -619,6 +627,7 @@
        .rewind = snd_pcm_meter_rewind,
        .forward = snd_pcm_meter_forward,
        .resume = snd_pcm_meter_resume,
+       .poll_ask = snd_pcm_meter_poll_ask,
        .writei = snd_pcm_mmap_writei,
        .writen = snd_pcm_mmap_writen,
        .readi = snd_pcm_mmap_readi,

Index: pcm_multi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_multi.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- pcm_multi.c 25 Feb 2004 11:24:30 -0000      1.86
+++ pcm_multi.c 17 Mar 2004 11:48:15 -0000      1.87
@@ -560,6 +560,23 @@
        return err;
 }
 
+static int snd_pcm_multi_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_multi_t *multi = pcm->private_data;
+       snd_pcm_t *slave;
+       int err = 0;
+       unsigned int i;
+       for (i = 0; i < multi->slaves_count; ++i) {
+               slave = multi->slaves[i].pcm;
+               if (slave->fast_ops->poll_ask == NULL)
+                       continue;
+               err = slave->fast_ops->poll_ask(slave->fast_op_arg);
+               if (err < 0)
+                       return err;
+       }
+       return err;
+}
+
 static snd_pcm_sframes_t snd_pcm_multi_mmap_commit(snd_pcm_t *pcm,
                                                   snd_pcm_uframes_t offset,
                                                   snd_pcm_uframes_t size)
@@ -646,6 +663,7 @@
        .rewind = snd_pcm_multi_rewind,
        .forward = snd_pcm_multi_forward,
        .resume = snd_pcm_multi_resume,
+       .poll_ask = snd_pcm_multi_poll_ask,
        .avail_update = snd_pcm_multi_avail_update,
        .mmap_commit = snd_pcm_multi_mmap_commit,
 };

Index: pcm_null.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_null.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- pcm_null.c  7 Aug 2003 14:20:32 -0000       1.49
+++ pcm_null.c  17 Mar 2004 11:48:15 -0000      1.50
@@ -342,6 +342,7 @@
        .rewind = snd_pcm_null_rewind,
        .forward = snd_pcm_null_forward,
        .resume = snd_pcm_null_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_null_writei,
        .writen = snd_pcm_null_writen,
        .readi = snd_pcm_null_readi,

Index: pcm_plugin.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_plugin.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- pcm_plugin.c        4 Feb 2004 09:21:11 -0000       1.93
+++ pcm_plugin.c        17 Mar 2004 11:48:15 -0000      1.94
@@ -343,6 +343,14 @@
        return snd_pcm_resume(plugin->slave);
 }
 
+int snd_pcm_plugin_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_plugin_t *plugin = pcm->private_data;
+       if (plugin->slave->fast_ops->poll_ask)
+               return plugin->slave->fast_ops->poll_ask(plugin->slave->fast_op_arg);
+       return 0;
+}
+
 static snd_pcm_sframes_t snd_pcm_plugin_write_areas(snd_pcm_t *pcm,
                                                    const snd_pcm_channel_area_t 
*areas,
                                                    snd_pcm_uframes_t offset,
@@ -662,6 +670,7 @@
        .rewind = snd_pcm_plugin_rewind,
        .forward = snd_pcm_plugin_forward,
        .resume = snd_pcm_plugin_resume,
+       .poll_ask = snd_pcm_plugin_poll_ask,
        .writei = snd_pcm_plugin_writei,
        .writen = snd_pcm_plugin_writen,
        .readi = snd_pcm_plugin_readi,

Index: pcm_rate.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_rate.c,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -r1.80 -r1.81
--- pcm_rate.c  8 Feb 2004 14:18:06 -0000       1.80
+++ pcm_rate.c  17 Mar 2004 11:48:15 -0000      1.81
@@ -79,6 +79,8 @@
        int close_slave;
        snd_atomic_write_t watom;
        snd_pcm_uframes_t appl_ptr, hw_ptr;
+       snd_pcm_uframes_t orig_avail_min;
+       snd_pcm_sw_params_t sw_params;
        enum rate_type type;
        unsigned int get_idx;
        unsigned int put_idx;
@@ -556,10 +558,11 @@
 {
        snd_pcm_rate_t *rate = pcm->private_data;
        snd_pcm_t *slave = rate->slave;
-       snd_pcm_sw_params_t sparams;
+       snd_pcm_sw_params_t *sparams;
        snd_pcm_uframes_t boundary1, boundary2;
 
-       sparams = *params;
+       rate->sw_params = *params;
+       sparams = &rate->sw_params;
        if ((rate->pitch >= LINEAR_DIV ? 1 : 0) ^ (pcm->stream == 
SND_PCM_STREAM_CAPTURE ? 1 : 0)) {
                boundary1 = pcm->buffer_size;
                boundary2 = slave->buffer_size;
@@ -576,7 +579,7 @@
                }
        }
        params->boundary = boundary1;
-       sparams.boundary = boundary2;
+       sparams->boundary = boundary2;
        if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
                rate->pitch = (((u_int64_t)slave->period_size * LINEAR_DIV) + 
pcm->period_size - 1) / pcm->period_size;
                do {
@@ -624,17 +627,18 @@
                } while (1);
                assert((snd_pcm_uframes_t)snd_pcm_rate_slave_frames(pcm, 
pcm->period_size - 1) == slave->period_size - 1);
        }
-       recalc(pcm, &sparams.avail_min);
-       recalc(pcm, &sparams.xfer_align);
-       recalc(pcm, &sparams.start_threshold);
-       if (sparams.stop_threshold >= sparams.boundary) {
-               sparams.stop_threshold = sparams.boundary;
+       recalc(pcm, &sparams->avail_min);
+       rate->orig_avail_min = sparams->avail_min;
+       recalc(pcm, &sparams->xfer_align);
+       recalc(pcm, &sparams->start_threshold);
+       if (sparams->stop_threshold >= sparams->boundary) {
+               sparams->stop_threshold = sparams->boundary;
        } else {
-               recalc(pcm, &sparams.stop_threshold);
+               recalc(pcm, &sparams->stop_threshold);
        }
-       recalc(pcm, &sparams.silence_threshold);
-       recalc(pcm, &sparams.silence_size);
-       return snd_pcm_sw_params(slave, &sparams);
+       recalc(pcm, &sparams->silence_threshold);
+       recalc(pcm, &sparams->silence_size);
+       return snd_pcm_sw_params(slave, sparams);
 }
 
 static int snd_pcm_rate_init(snd_pcm_t *pcm)
@@ -913,6 +917,36 @@
        return snd_pcm_resume(rate->slave);
 }
 
+static int snd_pcm_rate_poll_ask(snd_pcm_t *pcm)
+{
+       snd_pcm_rate_t *rate = pcm->private_data;
+       snd_pcm_uframes_t avail_min;
+       int err;
+
+       if (rate->slave->fast_ops->poll_ask) {
+               err = rate->slave->fast_ops->poll_ask(rate->slave->fast_op_arg);
+               if (err < 0)
+                       return err;
+       }
+       avail_min = rate->appl_ptr % pcm->period_size;
+       if (avail_min > 0) {
+               recalc(pcm, &avail_min);
+               if (avail_min < rate->slave->buffer_size &&
+                   avail_min != rate->slave->period_size)
+                       avail_min++;    /* 1st small little rounding correction */
+               if (avail_min < rate->slave->buffer_size &&
+                   avail_min != rate->slave->period_size)
+                       avail_min++;    /* 2nd small little rounding correction */
+               avail_min += rate->orig_avail_min;
+       } else {
+               avail_min = rate->orig_avail_min;
+       }
+       if (rate->sw_params.avail_min == avail_min)
+               return 0;
+       rate->sw_params.avail_min = avail_min;
+       return snd_pcm_sw_params(rate->slave, &rate->sw_params);
+}
+
 static int snd_pcm_rate_commit_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t 
appl_offset)
 {
        snd_pcm_rate_t *rate = pcm->private_data;
@@ -1291,6 +1325,7 @@
        .rewind = snd_pcm_rate_rewind,
        .forward = snd_pcm_rate_forward,
        .resume = snd_pcm_rate_resume,
+       .poll_ask = snd_pcm_rate_poll_ask,
        .writei = snd_pcm_mmap_writei,
        .writen = snd_pcm_mmap_writen,
        .readi = snd_pcm_mmap_readi,

Index: pcm_share.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_share.c,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- pcm_share.c 25 Feb 2004 11:24:30 -0000      1.78
+++ pcm_share.c 17 Mar 2004 11:48:15 -0000      1.79
@@ -1296,6 +1296,7 @@
        .rewind = snd_pcm_share_rewind,
        .forward = snd_pcm_share_forward,
        .resume = snd_pcm_share_resume,
+       .poll_ask = NULL, /* FIXME */
        .avail_update = snd_pcm_share_avail_update,
        .mmap_commit = snd_pcm_share_mmap_commit,
 };

Index: pcm_shm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_shm.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- pcm_shm.c   25 Feb 2004 11:24:30 -0000      1.59
+++ pcm_shm.c   17 Mar 2004 11:48:15 -0000      1.60
@@ -602,6 +602,7 @@
        .rewind = snd_pcm_shm_rewind,
        .forward = snd_pcm_shm_forward,
        .resume = snd_pcm_shm_resume,
+       .poll_ask = NULL,
        .writei = snd_pcm_mmap_writei,
        .writen = snd_pcm_mmap_writen,
        .readi = snd_pcm_mmap_readi,



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to