diff options
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/alsa/alsa-mixer.c | 4 | ||||
| -rw-r--r-- | src/modules/alsa/alsa-sink.c | 36 | ||||
| -rw-r--r-- | src/modules/alsa/alsa-source.c | 35 | ||||
| -rw-r--r-- | src/modules/alsa/alsa-util.c | 55 | ||||
| l--------- | src/modules/alsa/mixer/Makefile | 1 | ||||
| l--------- | src/modules/alsa/mixer/paths/Makefile | 1 | ||||
| -rw-r--r-- | src/modules/alsa/mixer/paths/analog-output-headphones.conf | 4 | ||||
| -rw-r--r-- | src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf | 6 | ||||
| -rw-r--r-- | src/modules/alsa/mixer/paths/analog-output-mono.conf | 6 | ||||
| -rw-r--r-- | src/modules/alsa/mixer/paths/analog-output.conf | 6 | ||||
| l--------- | src/modules/alsa/mixer/profile-sets/Makefile | 1 | ||||
| -rw-r--r-- | src/modules/module-hal-detect.c | 25 | ||||
| -rw-r--r-- | src/modules/module-pipe-sink.c | 6 | ||||
| -rw-r--r-- | src/modules/module-pipe-source.c | 2 | ||||
| -rw-r--r-- | src/modules/module-tunnel.c | 26 | ||||
| -rw-r--r-- | src/modules/module-udev-detect.c | 12 | 
16 files changed, 170 insertions, 56 deletions
| diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index a5515e1b..6a0b4ab7 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -940,7 +940,6 @@ int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m) {      PA_LLIST_FOREACH(e, p->elements) {          switch (e->switch_use) { -            case PA_ALSA_SWITCH_MUTE:              case PA_ALSA_SWITCH_OFF:                  r = element_set_switch(e, m, FALSE);                  break; @@ -949,6 +948,7 @@ int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m) {                  r = element_set_switch(e, m, TRUE);                  break; +            case PA_ALSA_SWITCH_MUTE:              case PA_ALSA_SWITCH_IGNORE:              case PA_ALSA_SWITCH_SELECT:                  r = 0; @@ -960,7 +960,6 @@ int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m) {          switch (e->volume_use) {              case PA_ALSA_VOLUME_OFF: -            case PA_ALSA_VOLUME_MERGE:                  r = element_mute_volume(e, m);                  break; @@ -968,6 +967,7 @@ int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m) {                  r = element_zero_volume(e, m);                  break; +            case PA_ALSA_VOLUME_MERGE:              case PA_ALSA_VOLUME_IGNORE:                  r = 0;                  break; diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index e7925902..1c38430f 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -340,6 +340,9 @@ static int try_recover(struct userdata *u, const char *call, int err) {      if (err == -EPIPE)          pa_log_debug("%s: Buffer underrun!", call); +    if (err == -ESTRPIPE) +        pa_log_debug("%s: System suspended!", call); +      if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {          pa_log("%s: %s", call, pa_alsa_strerror(err));          return -1; @@ -401,6 +404,7 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle          snd_pcm_sframes_t n;          size_t n_bytes;          int r; +        pa_bool_t after_avail = TRUE;          /* First we determine how many samples are missing to fill the           * buffer up to 100% */ @@ -484,6 +488,9 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle              if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { +                if (!after_avail && err == -EAGAIN) +                    break; +                  if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0)                      continue; @@ -494,9 +501,12 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle              if (frames > pa_mempool_block_size_max(u->sink->core->mempool)/u->frame_size)                  frames = pa_mempool_block_size_max(u->sink->core->mempool)/u->frame_size; -            if (frames == 0) +            if (!after_avail && frames == 0)                  break; +            pa_assert(frames > 0); +            after_avail = FALSE; +              /* Check these are multiples of 8 bit */              pa_assert((areas[0].first & 7) == 0);              pa_assert((areas[0].step & 7)== 0); @@ -617,6 +627,7 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle          for (;;) {              snd_pcm_sframes_t frames;              void *p; +            pa_bool_t after_avail = TRUE;  /*         pa_log_debug("%lu frames to write", (unsigned long) frames); */ @@ -634,17 +645,23 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle              frames = snd_pcm_writei(u->pcm_handle, (const uint8_t*) p + u->memchunk.index, (snd_pcm_uframes_t) frames);              pa_memblock_release(u->memchunk.memblock); -            if (frames == 0) -                break; -              if (PA_UNLIKELY(frames < 0)) { +                if (!after_avail && (int) frames == -EAGAIN) +                    break; +                  if ((r = try_recover(u, "snd_pcm_writei", (int) frames)) == 0)                      continue;                  return r;              } +            if (!after_avail && frames == 0) +                break; + +            pa_assert(frames > 0); +            after_avail = FALSE; +              u->memchunk.index += (size_t) frames * u->frame_size;              u->memchunk.length -= (size_t) frames * u->frame_size; @@ -885,9 +902,13 @@ static int unsuspend(struct userdata *u) {      if (build_pollfd(u) < 0)          goto fail; +    u->write_count = 0; +    pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE); +      u->first = TRUE;      u->since_start = 0; +      pa_log_info("Resumed successfully...");      return 0; @@ -1181,8 +1202,11 @@ static int process_rewind(struct userdata *u) {          pa_log_debug("before: %lu", (unsigned long) in_frames);          if ((out_frames = snd_pcm_rewind(u->pcm_handle, (snd_pcm_uframes_t) in_frames)) < 0) {              pa_log("snd_pcm_rewind() failed: %s", pa_alsa_strerror((int) out_frames)); -            return -1; +            if (try_recover(u, "process_rewind", out_frames) < 0) +                return -1; +            out_frames = 0;          } +          pa_log_debug("after: %lu", (unsigned long) out_frames);          rewind_nbytes = (size_t) out_frames * u->frame_size; @@ -1190,7 +1214,7 @@ static int process_rewind(struct userdata *u) {          if (rewind_nbytes <= 0)              pa_log_info("Tried rewind, but was apparently not possible.");          else { -            u->write_count -= out_frames * u->frame_size; +            u->write_count -= rewind_nbytes;              pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes);              pa_sink_process_rewind(u->sink, rewind_nbytes); diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index 41bb768b..9a51f857 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -333,6 +333,9 @@ static int try_recover(struct userdata *u, const char *call, int err) {      if (err == -EPIPE)          pa_log_debug("%s: Buffer overrun!", call); +    if (err == -ESTRPIPE) +        pa_log_debug("%s: System suspended!", call); +      if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {          pa_log("%s: %s", call, pa_alsa_strerror(err));          return -1; @@ -391,6 +394,7 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled          snd_pcm_sframes_t n;          size_t n_bytes;          int r; +        pa_bool_t after_avail = TRUE;          if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { @@ -463,6 +467,9 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled              if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) { +                if (!after_avail && err == -EAGAIN) +                    break; +                  if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0)                      continue; @@ -473,9 +480,12 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled              if (frames > pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size)                  frames = pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size; -            if (frames == 0) +            if (!after_avail && frames == 0)                  break; +            pa_assert(frames > 0); +            after_avail = FALSE; +              /* Check these are multiples of 8 bit */              pa_assert((areas[0].first & 7) == 0);              pa_assert((areas[0].step & 7)== 0); @@ -542,6 +552,7 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled          snd_pcm_sframes_t n;          size_t n_bytes;          int r; +        pa_bool_t after_avail = TRUE;          if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { @@ -602,20 +613,26 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled              frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames);              pa_memblock_release(chunk.memblock); -            if (frames == 0) { -                pa_memblock_unref(chunk.memblock); -                break; -            } -              if (PA_UNLIKELY(frames < 0)) {                  pa_memblock_unref(chunk.memblock); -                if ((r = try_recover(u, "snd_pcm_readi", (int) (frames))) == 0) +                if (!after_avail && (int) frames == -EAGAIN) +                    break; + +                if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0)                      continue;                  return r;              } +            if (!after_avail && frames == 0) { +                pa_memblock_unref(chunk.memblock); +                break; +            } + +            pa_assert(frames > 0); +            after_avail = FALSE; +              chunk.index = 0;              chunk.length = (size_t) frames * u->frame_size; @@ -840,7 +857,9 @@ static int unsuspend(struct userdata *u) {      /* FIXME: We need to reload the volume somehow */      snd_pcm_start(u->pcm_handle); -    pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE); + +    u->read_count = 0; +    pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);      pa_log_info("Resumed successfully..."); diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c index 1f3e5dcd..a47a8958 100644 --- a/src/modules/alsa/alsa-util.c +++ b/src/modules/alsa/alsa-util.c @@ -233,14 +233,16 @@ int pa_alsa_set_hw_params(          goto finish;      } -    if (_period_size && tsched_size && _periods) { +    if (_period_size > 0 && tsched_size > 0 && _periods > 0) { +        snd_pcm_uframes_t buffer_size; +        unsigned int p;          /* Adjust the buffer sizes, if we didn't get the rate we were asking for */          _period_size = (snd_pcm_uframes_t) (((uint64_t) _period_size * r) / ss->rate);          tsched_size = (snd_pcm_uframes_t) (((uint64_t) tsched_size * r) / ss->rate);          if (_use_tsched) { -            snd_pcm_uframes_t buffer_size = 0; +            buffer_size = 0;              if ((ret = snd_pcm_hw_params_get_buffer_size_max(hwparams, &buffer_size)) < 0)                  pa_log_warn("snd_pcm_hw_params_get_buffer_size_max() failed: %s", pa_alsa_strerror(ret)); @@ -251,32 +253,33 @@ int pa_alsa_set_hw_params(              _periods = 1;          } -        if (_period_size > 0 && _periods > 0) { -            snd_pcm_uframes_t buffer_size; - -            buffer_size = _periods * _period_size; - -            if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &buffer_size)) < 0) -                pa_log_info("snd_pcm_hw_params_set_buffer_size_near() failed: %s", pa_alsa_strerror(ret)); -        } - -        if (_periods > 0) { - -            /* First we pass 0 as direction to get exactly what we -             * asked for. That this is necessary is presumably a bug -             * in ALSA. All in all this is mostly a hint to ALSA, so -             * we don't care if this fails. */ - -            dir = 0; -            if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir) < 0) { -                dir = 1; -                if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir) < 0) { -                    dir = -1; -                    if ((ret = snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir)) < 0) -                        pa_log_info("snd_pcm_hw_params_set_periods_near() failed: %s", pa_alsa_strerror(ret)); -                } +        /* Some ALSA drivers really don't like if we set the buffer +         * size first and the number of periods second. (which would +         * make a lot more sense to me) So, follow this rule and +         * adjust the periods first and the buffer size second */ + +        /* First we pass 0 as direction to get exactly what we +         * asked for. That this is necessary is presumably a bug +         * in ALSA. All in all this is mostly a hint to ALSA, so +         * we don't care if this fails. */ + +        p = _periods; +        dir = 0; +        if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &p, &dir) < 0) { +            p = _periods; +            dir = 1; +            if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &p, &dir) < 0) { +                p = _periods; +                dir = -1; +                if ((ret = snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &p, &dir)) < 0) +                    pa_log_info("snd_pcm_hw_params_set_periods_near() failed: %s", pa_alsa_strerror(ret));              }          } + +        /* Now set the buffer size */ +        buffer_size = _periods * _period_size; +        if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &buffer_size)) < 0) +            pa_log_info("snd_pcm_hw_params_set_buffer_size_near() failed: %s", pa_alsa_strerror(ret));      }      if  ((ret = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) diff --git a/src/modules/alsa/mixer/Makefile b/src/modules/alsa/mixer/Makefile new file mode 120000 index 00000000..b4955194 --- /dev/null +++ b/src/modules/alsa/mixer/Makefile @@ -0,0 +1 @@ +../../../pulse/Makefile
\ No newline at end of file diff --git a/src/modules/alsa/mixer/paths/Makefile b/src/modules/alsa/mixer/paths/Makefile new file mode 120000 index 00000000..dc23aaa2 --- /dev/null +++ b/src/modules/alsa/mixer/paths/Makefile @@ -0,0 +1 @@ +../../../../pulse/Makefile
\ No newline at end of file diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf index c018e0eb..691cb3f2 100644 --- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf +++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf @@ -44,6 +44,10 @@ volume = merge  override-map.1 = all  override-map.2 = all-left,all-right +[Element Speaker] +switch = off +volume = off +  [Element Front]  switch = off  volume = off diff --git a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf index 7a267890..2db976a5 100644 --- a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf +++ b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf @@ -45,6 +45,12 @@ override-map.2 = lfe,lfe  switch = off  volume = off +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right +  [Element Front]  switch = off  volume = off diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf index f6cb9f8a..a58cc970 100644 --- a/src/modules/alsa/mixer/paths/analog-output-mono.conf +++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf @@ -42,6 +42,12 @@ override-map.2 = all-left,all-right  switch = off  volume = off +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right +  [Element Front]  switch = off  volume = off diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf index ea108aaf..b412a437 100644 --- a/src/modules/alsa/mixer/paths/analog-output.conf +++ b/src/modules/alsa/mixer/paths/analog-output.conf @@ -41,6 +41,12 @@ volume = off  switch = off  volume = off +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right +  [Element Front]  switch = mute  volume = merge diff --git a/src/modules/alsa/mixer/profile-sets/Makefile b/src/modules/alsa/mixer/profile-sets/Makefile new file mode 120000 index 00000000..dc23aaa2 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/Makefile @@ -0,0 +1 @@ +../../../../pulse/Makefile
\ No newline at end of file diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c index 658b3e55..79758b92 100644 --- a/src/modules/module-hal-detect.c +++ b/src/modules/module-hal-detect.c @@ -57,12 +57,14 @@ PA_MODULE_VERSION(PACKAGE_VERSION);  PA_MODULE_LOAD_ONCE(TRUE);  #if defined(HAVE_ALSA) && defined(HAVE_OSS)  PA_MODULE_USAGE("api=<alsa or oss> " -                "tsched=<enable system timer based scheduling mode?>"); +                "tsched=<enable system timer based scheduling mode?>" +                "subdevs=<init all subdevices>");  #elif defined(HAVE_ALSA)  PA_MODULE_USAGE("api=<alsa> "                  "tsched=<enable system timer based scheduling mode?>");  #elif defined(HAVE_OSS) -PA_MODULE_USAGE("api=<oss>"); +PA_MODULE_USAGE("api=<oss>" +                "subdevs=<init all subdevices>");  #endif  PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-hal-detect!"); @@ -82,6 +84,9 @@ struct userdata {  #ifdef HAVE_ALSA      pa_bool_t use_tsched;  #endif +#ifdef HAVE_OSS +    pa_bool_t init_subdevs; +#endif  };  #define CAPABILITY_ALSA "alsa" @@ -92,6 +97,9 @@ static const char* const valid_modargs[] = {  #ifdef HAVE_ALSA      "tsched",  #endif +#ifdef HAVE_OSS +    "subdevs", +#endif      NULL  }; @@ -264,7 +272,7 @@ fail:  #ifdef HAVE_OSS -static pa_bool_t hal_oss_device_is_pcm(LibHalContext *context, const char *udi) { +static pa_bool_t hal_oss_device_is_pcm(LibHalContext *context, const char *udi, pa_bool_t init_subdevices) {      char *class = NULL, *dev = NULL, *e;      int device;      pa_bool_t r = FALSE; @@ -294,7 +302,7 @@ static pa_bool_t hal_oss_device_is_pcm(LibHalContext *context, const char *udi)      /* We only care for the main device */      device = libhal_device_get_property_int(context, udi, "oss.device", &error); -    if (dbus_error_is_set(&error) || device != 0) +    if (dbus_error_is_set(&error) || (device != 0 && init_subdevices == FALSE))          goto finish;      r = TRUE; @@ -324,7 +332,7 @@ static int hal_device_load_oss(struct userdata *u, const char *udi, struct devic      pa_assert(d);      /* We only care for OSS PCM devices */ -    if (!hal_oss_device_is_pcm(u->context, udi)) +    if (!hal_oss_device_is_pcm(u->context, udi, u->init_subdevs))          goto fail;      /* We store only one entry per card, hence we look for the originating device */ @@ -763,6 +771,13 @@ int pa__init(pa_module*m) {          goto fail;      } +#ifdef HAVE_OSS +    if (pa_modargs_get_value_boolean(ma, "subdevs", &u->init_subdevs) < 0) { +        pa_log("Failed to parse subdevs argument."); +        goto fail; +    } +#endif +      if (!(u->connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &error)) || dbus_error_is_set(&error)) {          pa_log_error("Unable to contact DBUS system bus: %s: %s", error.name, error.message);          goto fail; diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c index 8a7dc846..9c169327 100644 --- a/src/modules/module-pipe-sink.c +++ b/src/modules/module-pipe-sink.c @@ -122,7 +122,7 @@ static int process_render(struct userdata *u) {      pa_assert(u);      if (u->memchunk.length <= 0) -        pa_sink_render(u->sink, PIPE_BUF, &u->memchunk); +        pa_sink_render(u->sink, pa_pipe_buf(u->fd), &u->memchunk);      pa_assert(u->memchunk.length > 0); @@ -299,8 +299,8 @@ int pa__init(pa_module*m) {      pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);      pa_sink_set_rtpoll(u->sink, u->rtpoll); -    pa_sink_set_max_request(u->sink, PIPE_BUF); -    pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(PIPE_BUF, &u->sink->sample_spec)); +    pa_sink_set_max_request(u->sink, pa_pipe_buf(u->fd)); +    pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(pa_pipe_buf(u->fd), &u->sink->sample_spec));      u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);      pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); diff --git a/src/modules/module-pipe-source.c b/src/modules/module-pipe-source.c index e5609fb5..49104f8d 100644 --- a/src/modules/module-pipe-source.c +++ b/src/modules/module-pipe-source.c @@ -142,7 +142,7 @@ static void thread_func(void *userdata) {              void *p;              if (!u->memchunk.memblock) { -                u->memchunk.memblock = pa_memblock_new(u->core->mempool, PIPE_BUF); +                u->memchunk.memblock = pa_memblock_new(u->core->mempool, pa_pipe_buf(u->fd));                  u->memchunk.index = u->memchunk.length = 0;              } diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c index d1153829..f788f660 100644 --- a/src/modules/module-tunnel.c +++ b/src/modules/module-tunnel.c @@ -55,6 +55,7 @@  #include <pulsecore/core-error.h>  #include <pulsecore/proplist-util.h>  #include <pulsecore/auth-cookie.h> +#include <pulsecore/mcalign.h>  #ifdef TUNNEL_SINK  #include "module-tunnel-sink-symdef.h" @@ -194,6 +195,7 @@ struct userdata {  #else      char *source_name;      pa_source *source; +    pa_mcalign *mcalign;  #endif      pa_auth_cookie *auth_cookie; @@ -614,14 +616,23 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off              return 0;          } -        case SOURCE_MESSAGE_POST: +        case SOURCE_MESSAGE_POST: { +            pa_memchunk c; -            if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) -                pa_source_post(u->source, chunk); +            pa_mcalign_push(u->mcalign, chunk); -            u->counter += (int64_t) chunk->length; +            while (pa_mcalign_pop(u->mcalign, &c) >= 0) { + +                if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) +                    pa_source_post(u->source, &c); + +                pa_memblock_unref(c.memblock); + +                u->counter += (int64_t) c.length; +            }              return 0; +        }          case SOURCE_MESSAGE_REMOTE_SUSPEND: @@ -1937,6 +1948,8 @@ int pa__init(pa_module*m) {      pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);      pa_source_set_rtpoll(u->source, u->rtpoll); + +    u->mcalign = pa_mcalign_new(pa_frame_size(&u->source->sample_spec));  #endif      pa_xfree(dn); @@ -2030,6 +2043,11 @@ void pa__done(pa_module*m) {      if (u->time_event)          u->core->mainloop->time_free(u->time_event); +#ifndef TUNNEL_SINK +    if (u->mcalign) +        pa_mcalign_free(u->mcalign); +#endif +  #ifdef TUNNEL_SINK      pa_xfree(u->sink_name);  #else diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c index c8ec2bf9..11de1ccb 100644 --- a/src/modules/module-udev-detect.c +++ b/src/modules/module-udev-detect.c @@ -336,8 +336,18 @@ static int setup_inotify(struct userdata *u) {          pa_close(u->inotify_fd);          u->inotify_fd = -1; -        if (saved_errno == ENOENT) +        if (saved_errno == ENOENT) { +            pa_log_debug("/dev/snd/ is apparently not existing yet, retrying to create inotify watch later.");              return 0; +        } + +        if (saved_errno == ENOSPC) { +            pa_log("You apparently ran out of inotify watches, probably because Tracker/Beagle took them all away. " +                   "I wished people would do their homework first and fix inotify before using it for watching whole " +                   "directory trees which is something the current inotify is certainly not useful for. " +                   "Please make sure to drop the Tracker/Beagle guys a line complaining about their broken use of inotify."); +            return 0; +        }          pa_log("inotify_add_watch() failed: %s", pa_cstrerror(saved_errno));          return -1; | 
