diff --git a/alsa-lib-hg-fixes.diff b/alsa-lib-hg-fixes.diff index b520f54..1af19fd 100644 --- a/alsa-lib-hg-fixes.diff +++ b/alsa-lib-hg-fixes.diff @@ -1,6 +1,6 @@ diff -r 9e2f117f24b9 NOTES --- a/NOTES Mon Oct 15 10:36:46 2007 +0200 -+++ b/NOTES Fri Nov 30 18:33:19 2007 +0100 ++++ b/NOTES Thu Dec 13 17:40:26 2007 +0100 @@ -27,11 +27,14 @@ When LIBASOUND_DEBUG=1 is set, the error When LIBASOUND_DEBUG=1 is set, the errors in hw_params configuration will be dumped to stderr. Note that this will show even the non-fatal @@ -20,7 +20,7 @@ diff -r 9e2f117f24b9 NOTES Blocking Open Mode diff -r 9e2f117f24b9 configure.in --- a/configure.in Mon Oct 15 10:36:46 2007 +0200 -+++ b/configure.in Fri Nov 30 18:33:19 2007 +0100 ++++ b/configure.in Thu Dec 13 17:40:26 2007 +0100 @@ -167,6 +167,20 @@ else else AC_DEFINE(NDEBUG,,[No assert debug]) @@ -98,7 +98,7 @@ diff -r 9e2f117f24b9 configure.in src/conf/pcm/Makefile \ diff -r 9e2f117f24b9 doc/doxygen.cfg --- a/doc/doxygen.cfg Mon Oct 15 10:36:46 2007 +0200 -+++ b/doc/doxygen.cfg Fri Nov 30 18:33:19 2007 +0100 ++++ b/doc/doxygen.cfg Thu Dec 13 17:40:26 2007 +0100 @@ -28,8 +28,6 @@ INPUT = index.doxygen \ ../include/pcm_ioplug.h \ ../include/control_external.h \ @@ -110,7 +110,7 @@ diff -r 9e2f117f24b9 doc/doxygen.cfg ../src/async.c \ diff -r 9e2f117f24b9 include/Makefile.am --- a/include/Makefile.am Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/Makefile.am Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/Makefile.am Thu Dec 13 17:40:26 2007 +0100 @@ -44,10 +44,6 @@ endif if BUILD_SEQ @@ -124,7 +124,7 @@ diff -r 9e2f117f24b9 include/Makefile.am if BUILD_ALISP diff -r 9e2f117f24b9 include/control.h --- a/include/control.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/control.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/control.h Thu Dec 13 17:40:26 2007 +0100 @@ -279,7 +279,7 @@ size_t snd_ctl_elem_id_sizeof(void); * \brief allocate an invalid #snd_ctl_elem_id_t using standard alloca * \param ptr returned pointer @@ -264,7 +264,7 @@ diff -r 9e2f117f24b9 include/conv.h - diff -r 9e2f117f24b9 include/global.h --- a/include/global.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/global.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/global.h Thu Dec 13 17:40:26 2007 +0100 @@ -102,6 +102,9 @@ int snd_dlclose(void *handle); int snd_dlclose(void *handle); @@ -277,7 +277,7 @@ diff -r 9e2f117f24b9 include/global.h * diff -r 9e2f117f24b9 include/hwdep.h --- a/include/hwdep.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/hwdep.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/hwdep.h Thu Dec 13 17:40:26 2007 +0100 @@ -108,7 +108,7 @@ ssize_t snd_hwdep_read(snd_hwdep_t *hwde size_t snd_hwdep_info_sizeof(void); @@ -488,7 +488,7 @@ diff -r 9e2f117f24b9 include/instr.h - diff -r 9e2f117f24b9 include/local.h --- a/include/local.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/local.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/local.h Thu Dec 13 17:40:26 2007 +0100 @@ -76,24 +76,19 @@ #define _snd_seq_query_subscribe sndrv_seq_query_subs #define _snd_seq_client_pool sndrv_seq_client_pool @@ -546,7 +546,7 @@ diff -r 9e2f117f24b9 include/local.h int snd_dlobj_cache_add(const char *name, void *dlobj, void *open_func); diff -r 9e2f117f24b9 include/mixer.h --- a/include/mixer.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/mixer.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/mixer.h Thu Dec 13 17:40:26 2007 +0100 @@ -146,7 +146,7 @@ size_t snd_mixer_class_sizeof(void); * \brief allocate an invalid #snd_mixer_class_t using standard alloca * \param ptr returned pointer @@ -567,7 +567,7 @@ diff -r 9e2f117f24b9 include/mixer.h void snd_mixer_selem_id_copy(snd_mixer_selem_id_t *dst, const snd_mixer_selem_id_t *src); diff -r 9e2f117f24b9 include/pcm.h --- a/include/pcm.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/pcm.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/pcm.h Thu Dec 13 17:40:26 2007 +0100 @@ -470,7 +470,7 @@ size_t snd_pcm_info_sizeof(void); * \brief allocate an invalid #snd_pcm_info_t using standard alloca * \param ptr returned pointer @@ -633,7 +633,7 @@ diff -r 9e2f117f24b9 include/pcm.h void snd_pcm_status_copy(snd_pcm_status_t *dst, const snd_pcm_status_t *src); diff -r 9e2f117f24b9 include/rawmidi.h --- a/include/rawmidi.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/rawmidi.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/rawmidi.h Thu Dec 13 17:40:26 2007 +0100 @@ -93,7 +93,7 @@ size_t snd_rawmidi_info_sizeof(void); * \brief allocate an invalid #snd_rawmidi_info_t using standard alloca * \param ptr returned pointer @@ -663,7 +663,7 @@ diff -r 9e2f117f24b9 include/rawmidi.h void snd_rawmidi_status_copy(snd_rawmidi_status_t *dst, const snd_rawmidi_status_t *src); diff -r 9e2f117f24b9 include/seq.h --- a/include/seq.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/seq.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/seq.h Thu Dec 13 17:40:26 2007 +0100 @@ -45,15 +45,6 @@ extern "C" { /** Sequencer handle */ @@ -781,7 +781,7 @@ diff -r 9e2f117f24b9 include/seq.h void snd_seq_remove_events_copy(snd_seq_remove_events_t *dst, const snd_seq_remove_events_t *src); diff -r 9e2f117f24b9 include/seq_event.h --- a/include/seq_event.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/seq_event.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/seq_event.h Thu Dec 13 17:40:26 2007 +0100 @@ -133,25 +133,6 @@ enum snd_seq_event_type { /** Ports disconnected; event data type = #snd_seq_connect_t */ SND_SEQ_EVENT_PORT_UNSUBSCRIBED, @@ -945,7 +945,7 @@ diff -r 9e2f117f24b9 include/seq_event.h diff -r 9e2f117f24b9 include/sound/Makefile.am --- a/include/sound/Makefile.am Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/sound/Makefile.am Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/sound/Makefile.am Thu Dec 13 17:40:26 2007 +0100 @@ -1,7 +1,6 @@ alsasoundincludedir = ${includedir}/alsa alsasoundincludedir = ${includedir}/alsa/sound @@ -1853,7 +1853,7 @@ diff -r 9e2f117f24b9 include/sound/ainstr_simple.h -#endif /* __SOUND_AINSTR_SIMPLE_H */ diff -r 9e2f117f24b9 include/sound/asequencer.h --- a/include/sound/asequencer.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/sound/asequencer.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/sound/asequencer.h Thu Dec 13 17:40:26 2007 +0100 @@ -22,7 +22,7 @@ #ifndef __SOUND_ASEQUENCER_H #define __SOUND_ASEQUENCER_H @@ -2149,7 +2149,7 @@ diff -r 9e2f117f24b9 include/sound/asequencer.h diff -r 9e2f117f24b9 include/sound/asound_fm.h --- a/include/sound/asound_fm.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/sound/asound_fm.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/sound/asound_fm.h Thu Dec 13 17:40:26 2007 +0100 @@ -29,16 +29,16 @@ #define SNDRV_DM_FM_MODE_OPL2 0x00 #define SNDRV_DM_FM_MODE_OPL3 0x01 @@ -2252,7 +2252,7 @@ diff -r 9e2f117f24b9 include/sound/asound_fm.h #endif /* __SOUND_ASOUND_FM_H */ diff -r 9e2f117f24b9 include/timer.h --- a/include/timer.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/include/timer.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/include/timer.h Thu Dec 13 17:40:26 2007 +0100 @@ -164,7 +164,7 @@ ssize_t snd_timer_read(snd_timer_t *hand size_t snd_timer_id_sizeof(void); @@ -2300,7 +2300,7 @@ diff -r 9e2f117f24b9 include/timer.h void snd_timer_status_copy(snd_timer_status_t *dst, const snd_timer_status_t *src); diff -r 9e2f117f24b9 src/Makefile.am --- a/src/Makefile.am Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/Makefile.am Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/Makefile.am Thu Dec 13 17:40:26 2007 +0100 @@ -37,10 +37,6 @@ if BUILD_SEQ if BUILD_SEQ SUBDIRS += seq @@ -2314,7 +2314,7 @@ diff -r 9e2f117f24b9 src/Makefile.am SUBDIRS += alisp diff -r 9e2f117f24b9 src/Versions.in --- a/src/Versions.in Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/Versions.in Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/Versions.in Thu Dec 13 17:40:26 2007 +0100 @@ -1,8 +1,16 @@ ALSA_0.9 { ALSA_0.9 { global: @@ -2522,7 +2522,7 @@ diff -r 9e2f117f24b9 src/Versions.in -} ALSA_1.0.12; diff -r 9e2f117f24b9 src/conf.c --- a/src/conf.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/conf.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/conf.c Thu Dec 13 17:40:26 2007 +0100 @@ -2897,7 +2897,7 @@ int snd_config_hook_load_for_all_cards(s return err; if (snd_config_search(root, fdriver, &n) >= 0) { @@ -2543,7 +2543,7 @@ diff -r 9e2f117f24b9 src/conf.c } diff -r 9e2f117f24b9 src/conf/alsa.conf --- a/src/conf/alsa.conf Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/conf/alsa.conf Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/conf/alsa.conf Thu Dec 13 17:40:26 2007 +0100 @@ -317,7 +317,7 @@ ctl.default { } @@ -2555,7 +2555,7 @@ diff -r 9e2f117f24b9 src/conf/alsa.conf default { diff -r 9e2f117f24b9 src/conf/cards/CMI8788.conf --- a/src/conf/cards/CMI8788.conf Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/conf/cards/CMI8788.conf Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/conf/cards/CMI8788.conf Thu Dec 13 17:40:26 2007 +0100 @@ -1,10 +1,6 @@ # # Configuration for the CMI8788 chip @@ -2706,7 +2706,7 @@ diff -r 9e2f117f24b9 src/conf/cards/CMI8788.conf type hw diff -r 9e2f117f24b9 src/conf/cards/aliases.conf --- a/src/conf/cards/aliases.conf Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/conf/cards/aliases.conf Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/conf/cards/aliases.conf Thu Dec 13 17:40:26 2007 +0100 @@ -49,6 +49,7 @@ Canyon3D-2 cards.Maestro3 Canyon3D-2 cards.Maestro3 Azalia cards.HDA-Intel @@ -2717,7 +2717,7 @@ diff -r 9e2f117f24b9 src/conf/cards/aliases.conf diff -r 9e2f117f24b9 src/control/Makefile.am --- a/src/control/Makefile.am Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/control/Makefile.am Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/control/Makefile.am Thu Dec 13 17:40:26 2007 +0100 @@ -1,6 +1,6 @@ EXTRA_LTLIBRARIES = libcontrol.la EXTRA_LTLIBRARIES = libcontrol.la @@ -2728,7 +2728,7 @@ diff -r 9e2f117f24b9 src/control/Makefile.am libcontrol_la_SOURCES += control_shm.c diff -r 9e2f117f24b9 src/control/cards.c --- a/src/control/cards.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/control/cards.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/control/cards.c Thu Dec 13 17:40:26 2007 +0100 @@ -39,12 +39,7 @@ #define SND_FILE_LOAD ALOAD_DEVICE_DIRECTORY "aloadC%i" #endif @@ -2796,7 +2796,7 @@ diff -r 9e2f117f24b9 src/control/cards.c if (snd_ctl_card_info(handle, &info) < 0) { diff -r 9e2f117f24b9 src/control/control_local.h --- a/src/control/control_local.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/control/control_local.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/control/control_local.h Thu Dec 13 17:40:26 2007 +0100 @@ -89,6 +89,9 @@ struct _snd_hctl { }; @@ -2809,7 +2809,7 @@ diff -r 9e2f117f24b9 src/control/control_local.h #define _snd_ctl_async_descriptor _snd_ctl_poll_descriptor diff -r 9e2f117f24b9 src/control/tlv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/src/control/tlv.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/control/tlv.c Thu Dec 13 17:40:26 2007 +0100 @@ -0,0 +1,429 @@ +/** + * \file control/tlv.c @@ -3242,7 +3242,7 @@ diff -r 9e2f117f24b9 src/control/tlv.c +} diff -r 9e2f117f24b9 src/error.c --- a/src/error.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/error.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/error.c Thu Dec 13 17:40:26 2007 +0100 @@ -135,8 +135,11 @@ static void snd_err_msg_default(const ch fprintf(stderr, ": %s", snd_strerror(err)); putc('\n', stderr); @@ -3258,7 +3258,7 @@ diff -r 9e2f117f24b9 src/error.c /** diff -r 9e2f117f24b9 src/mixer/mixer_simple.h --- a/src/mixer/mixer_simple.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/mixer/mixer_simple.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/mixer/mixer_simple.h Thu Dec 13 17:40:26 2007 +0100 @@ -21,5 +21,11 @@ #include "mixer_abst.h" @@ -3273,7 +3273,7 @@ diff -r 9e2f117f24b9 src/mixer/mixer_simple.h int snd_mixer_simple_basic_register(snd_mixer_t *mixer, struct snd_mixer_selem_regopt *options, snd_mixer_class_t **classp); diff -r 9e2f117f24b9 src/mixer/simple_none.c --- a/src/mixer/simple_none.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/mixer/simple_none.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/mixer/simple_none.c Thu Dec 13 17:40:26 2007 +0100 @@ -35,7 +35,9 @@ #include #include @@ -3648,7 +3648,7 @@ diff -r 9e2f117f24b9 src/mixer/simple_none.c static int get_dB_ops(snd_mixer_elem_t *elem, diff -r 9e2f117f24b9 src/pcm/interval.h --- a/src/pcm/interval.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/interval.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/interval.h Thu Dec 13 17:40:26 2007 +0100 @@ -42,6 +42,22 @@ int snd_interval_never_eq(const snd_inte int snd_interval_never_eq(const snd_interval_t *i1, const snd_interval_t *i2); #endif @@ -3674,7 +3674,7 @@ diff -r 9e2f117f24b9 src/pcm/interval.h void snd_interval_mul(const snd_interval_t *a, const snd_interval_t *b, snd_interval_t *c); diff -r 9e2f117f24b9 src/pcm/pcm.c --- a/src/pcm/pcm.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm.c Thu Dec 13 17:40:26 2007 +0100 @@ -2226,9 +2226,10 @@ int snd_pcm_free(snd_pcm_t *pcm) return 0; } @@ -3713,7 +3713,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm.c } diff -r 9e2f117f24b9 src/pcm/pcm_asym.c --- a/src/pcm/pcm_asym.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_asym.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_asym.c Thu Dec 13 17:40:26 2007 +0100 @@ -109,7 +109,8 @@ int _snd_pcm_asym_open(snd_pcm_t **pcmp, err = snd_pcm_slave_conf(root, slave, &sconf, 0); if (err < 0) @@ -3726,7 +3726,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_asym.c } diff -r 9e2f117f24b9 src/pcm/pcm_direct.c --- a/src/pcm/pcm_direct.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_direct.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_direct.c Thu Dec 13 17:40:26 2007 +0100 @@ -109,13 +109,15 @@ retryget: } dmix->shmptr = shmat(dmix->shmid, 0, 0); @@ -3754,10 +3754,21 @@ diff -r 9e2f117f24b9 src/pcm/pcm_direct.c } } return 0; -@@ -999,6 +1001,17 @@ int snd_pcm_direct_initialize_slave(snd_ - return ret; - } - +@@ -883,6 +885,7 @@ int snd_pcm_direct_initialize_slave(snd_ + SND_PCM_FORMAT_S16, + SND_PCM_FORMAT_S16 ^ SND_PCM_FORMAT_S16_LE ^ SND_PCM_FORMAT_S16_BE, + SND_PCM_FORMAT_S24_3LE, ++ SND_PCM_FORMAT_U8, + }; + snd_pcm_format_t format; + unsigned int i; +@@ -996,6 +999,17 @@ int snd_pcm_direct_initialize_slave(snd_ + ret = snd_pcm_sw_params_set_stop_threshold(spcm, sw_params, boundary); + if (ret < 0) { + SNDERR("unable to set stop threshold"); ++ return ret; ++ } ++ + /* set timestamp mode to MMAP + * the slave timestamp is copied appropriately in dsnoop/dmix/dshare + * based on the tstamp_mode of each client @@ -3766,19 +3777,74 @@ diff -r 9e2f117f24b9 src/pcm/pcm_direct.c + SND_PCM_TSTAMP_MMAP); + if (ret < 0) { + SNDERR("unable to tstamp mode MMAP"); -+ return ret; -+ } -+ - if (dmix->type != SND_PCM_TYPE_DMIX) - goto __skip_silencing; + return ret; + } diff -r 9e2f117f24b9 src/pcm/pcm_direct.h --- a/src/pcm/pcm_direct.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_direct.h Fri Nov 30 18:33:19 2007 +0100 -@@ -161,6 +161,66 @@ struct snd_pcm_direct { ++++ b/src/pcm/pcm_direct.h Thu Dec 13 17:40:26 2007 +0100 +@@ -24,20 +24,30 @@ + #define DIRECT_IPC_SEMS 1 + #define DIRECT_IPC_SEM_CLIENT 0 + +-typedef void (mix_areas1_t)(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step); ++typedef void (mix_areas_t)(unsigned int size, ++ volatile void *dst, void *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step); + +-typedef void (mix_areas2_t)(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step); ++typedef void (mix_areas_16_t)(unsigned int size, ++ volatile signed short *dst, signed short *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step); + +-typedef void (mix_areas3_t)(unsigned int size, +- volatile unsigned char *dst, unsigned char *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step); ++typedef void (mix_areas_32_t)(unsigned int size, ++ volatile signed int *dst, signed int *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step); ++ ++typedef void (mix_areas_24_t)(unsigned int size, ++ volatile unsigned char *dst, unsigned char *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step); ++ ++typedef void (mix_areas_u8_t)(unsigned int size, ++ volatile unsigned char *dst, unsigned char *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step); + + struct slave_params { + snd_pcm_format_t format; +@@ -148,9 +158,10 @@ struct snd_pcm_direct { + struct { + int shmid_sum; /* IPC global sum ring buffer memory identification */ + signed int *sum_buffer; /* shared sum buffer */ +- mix_areas1_t *mix_areas1; +- mix_areas2_t *mix_areas2; +- mix_areas3_t *mix_areas3; ++ mix_areas_16_t *mix_areas_16; ++ mix_areas_32_t *mix_areas_32; ++ mix_areas_24_t *mix_areas_24; ++ mix_areas_u8_t *mix_areas_u8; + } dmix; + struct { + } dsnoop; +@@ -160,6 +171,66 @@ struct snd_pcm_direct { + } u; void (*server_free)(snd_pcm_direct_t *direct); }; - ++ +/* make local functions really local */ +#define snd_pcm_direct_semaphore_create_or_connect \ + snd1_pcm_direct_semaphore_create_or_connect @@ -3838,14 +3904,160 @@ diff -r 9e2f117f24b9 src/pcm/pcm_direct.h + snd1_pcm_direct_open_secondary_client +#define snd_pcm_direct_parse_open_conf \ + snd1_pcm_direct_parse_open_conf -+ + int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix); - static inline int snd_pcm_direct_semaphore_discard(snd_pcm_direct_t *dmix) diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c --- a/src/pcm/pcm_dmix.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_dmix.c Fri Nov 30 18:33:19 2007 +0100 -@@ -367,11 +367,8 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm ++++ b/src/pcm/pcm_dmix.c Thu Dec 13 17:40:26 2007 +0100 +@@ -156,95 +156,60 @@ static void mix_areas(snd_pcm_direct_t * + snd_pcm_uframes_t dst_ofs, + snd_pcm_uframes_t size) + { +- volatile signed int *sum; + unsigned int src_step, dst_step; +- unsigned int chn, dchn, channels; ++ unsigned int chn, dchn, channels, sample_size; ++ mix_areas_t *do_mix_areas; + + channels = dmix->channels; +- if (dmix->shmptr->s.format == SND_PCM_FORMAT_S16_LE || +- dmix->shmptr->s.format == SND_PCM_FORMAT_S16_BE) { +- signed short *src; +- volatile signed short *dst; +- if (dmix->interleaved) { +- /* +- * process all areas in one loop +- * it optimizes the memory accesses for this case +- */ +- dmix->u.dmix.mix_areas1(size * channels, +- ((signed short *)dst_areas[0].addr) + (dst_ofs * channels), +- ((signed short *)src_areas[0].addr) + (src_ofs * channels), +- dmix->u.dmix.sum_buffer + (dst_ofs * channels), +- sizeof(signed short), +- sizeof(signed short), +- sizeof(signed int)); +- return; +- } +- for (chn = 0; chn < channels; chn++) { +- dchn = dmix->bindings ? dmix->bindings[chn] : chn; +- if (dchn >= dmix->shmptr->s.channels) +- continue; +- src_step = src_areas[chn].step / 8; +- dst_step = dst_areas[dchn].step / 8; +- src = (signed short *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step)); +- dst = (signed short *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step)); +- sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn; +- dmix->u.dmix.mix_areas1(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int)); +- } +- } else if (dmix->shmptr->s.format == SND_PCM_FORMAT_S32_LE || +- dmix->shmptr->s.format == SND_PCM_FORMAT_S32_BE) { +- signed int *src; +- volatile signed int *dst; +- if (dmix->interleaved) { +- /* +- * process all areas in one loop +- * it optimizes the memory accesses for this case +- */ +- dmix->u.dmix.mix_areas2(size * channels, +- ((signed int *)dst_areas[0].addr) + (dst_ofs * channels), +- ((signed int *)src_areas[0].addr) + (src_ofs * channels), +- dmix->u.dmix.sum_buffer + (dst_ofs * channels), +- sizeof(signed int), +- sizeof(signed int), +- sizeof(signed int)); +- return; +- } +- for (chn = 0; chn < channels; chn++) { +- dchn = dmix->bindings ? dmix->bindings[chn] : chn; +- if (dchn >= dmix->shmptr->s.channels) +- continue; +- src_step = src_areas[chn].step / 8; +- dst_step = dst_areas[dchn].step / 8; +- src = (signed int *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step)); +- dst = (signed int *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step)); +- sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn; +- dmix->u.dmix.mix_areas2(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int)); +- } +- } else { /* SND_PCM_FORMAT_S24_3LE */ +- unsigned char *src; +- volatile unsigned char *dst; +- if (dmix->interleaved) { +- /* +- * process all areas in one loop +- * it optimizes the memory accesses for this case +- */ +- dmix->u.dmix.mix_areas3(size * channels, +- ((unsigned char *)dst_areas[0].addr) + 3 * dst_ofs * channels, +- ((unsigned char *)src_areas[0].addr) + 3 * src_ofs * channels, +- dmix->u.dmix.sum_buffer + (dst_ofs * channels), +- 3, 3, sizeof(signed int)); +- return; +- } +- for (chn = 0; chn < channels; chn++) { +- dchn = dmix->bindings ? dmix->bindings[chn] : chn; +- if (dchn >= dmix->shmptr->s.channels) +- continue; +- src_step = src_areas[chn].step / 8; +- dst_step = dst_areas[dchn].step / 8; +- src = (unsigned char *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step)); +- dst = (unsigned char *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step)); +- sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn; +- dmix->u.dmix.mix_areas3(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int)); +- } ++ switch (dmix->shmptr->s.format) { ++ case SND_PCM_FORMAT_S16_LE: ++ case SND_PCM_FORMAT_S16_BE: ++ sample_size = 2; ++ do_mix_areas = (mix_areas_t *)dmix->u.dmix.mix_areas_16; ++ break; ++ case SND_PCM_FORMAT_S32_LE: ++ case SND_PCM_FORMAT_S32_BE: ++ sample_size = 4; ++ do_mix_areas = (mix_areas_t *)dmix->u.dmix.mix_areas_32; ++ break; ++ case SND_PCM_FORMAT_S24_3LE: ++ sample_size = 3; ++ do_mix_areas = (mix_areas_t *)dmix->u.dmix.mix_areas_24; ++ break; ++ case SND_PCM_FORMAT_U8: ++ sample_size = 1; ++ do_mix_areas = (mix_areas_t *)dmix->u.dmix.mix_areas_u8; ++ break; ++ default: ++ return; ++ } ++ if (dmix->interleaved) { ++ /* ++ * process all areas in one loop ++ * it optimizes the memory accesses for this case ++ */ ++ do_mix_areas(size * channels, ++ (unsigned char *)dst_areas[0].addr + sample_size * dst_ofs * channels, ++ (unsigned char *)src_areas[0].addr + sample_size * src_ofs * channels, ++ dmix->u.dmix.sum_buffer + dst_ofs * channels, ++ sample_size, ++ sample_size, ++ sizeof(signed int)); ++ return; ++ } ++ for (chn = 0; chn < channels; chn++) { ++ dchn = dmix->bindings ? dmix->bindings[chn] : chn; ++ if (dchn >= dmix->shmptr->s.channels) ++ continue; ++ src_step = src_areas[chn].step / 8; ++ dst_step = dst_areas[dchn].step / 8; ++ do_mix_areas(size, ++ ((unsigned char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + dst_ofs * dst_step, ++ ((unsigned char *)src_areas[chn].addr + src_areas[chn].first / 8) + src_ofs * src_step, ++ dmix->u.dmix.sum_buffer + channels * dst_ofs + chn, ++ dst_step, ++ src_step, ++ channels * sizeof(signed int)); + } + } + +@@ -367,11 +332,8 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm if (avail > dmix->avail_max) dmix->avail_max = avail; if (avail >= pcm->stop_threshold) { @@ -3858,7 +4070,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c if (dmix->state == SND_PCM_STATE_RUNNING) { dmix->state = SND_PCM_STATE_XRUN; return -EPIPE; -@@ -420,7 +417,10 @@ static int snd_pcm_dmix_status(snd_pcm_t +@@ -420,7 +382,10 @@ static int snd_pcm_dmix_status(snd_pcm_t memset(status, 0, sizeof(*status)); status->state = snd_pcm_dmix_state(pcm); status->trigger_tstamp = dmix->trigger_tstamp; @@ -3870,7 +4082,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c status->avail = snd_pcm_mmap_playback_avail(pcm); status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max; dmix->avail_max = 0; -@@ -525,7 +525,6 @@ static int snd_pcm_dmix_start(snd_pcm_t +@@ -525,7 +490,6 @@ static int snd_pcm_dmix_start(snd_pcm_t { snd_pcm_direct_t *dmix = pcm->private_data; snd_pcm_sframes_t avail; @@ -3878,7 +4090,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c int err; if (dmix->state != SND_PCM_STATE_PREPARED) -@@ -540,9 +539,7 @@ static int snd_pcm_dmix_start(snd_pcm_t +@@ -540,9 +504,7 @@ static int snd_pcm_dmix_start(snd_pcm_t return err; snd_pcm_dmix_sync_area(pcm); } @@ -3889,7 +4101,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c return 0; } -@@ -652,9 +649,10 @@ static int snd_pcm_dmix_close(snd_pcm_t +@@ -652,9 +614,10 @@ static int snd_pcm_dmix_close(snd_pcm_t if (dmix->client) snd_pcm_direct_client_discard(dmix); shm_sum_discard(dmix); @@ -3903,9 +4115,455 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dmix.c snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT); free(dmix->bindings); pcm->private_data = NULL; +diff -r 9e2f117f24b9 src/pcm/pcm_dmix_generic.c +--- a/src/pcm/pcm_dmix_generic.c Mon Oct 15 10:36:46 2007 +0200 ++++ b/src/pcm/pcm_dmix_generic.c Thu Dec 13 17:40:26 2007 +0100 +@@ -48,10 +48,10 @@ static inline unsigned long __cmpxchg(vo + #endif + + #if IS_CONCURRENT +-static void mix_areas1(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void mix_areas_16(unsigned int size, ++ volatile signed short *dst, signed short *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + register signed int sample, old_sample; + +@@ -79,10 +79,10 @@ static void mix_areas1(unsigned int size + } + } + +-static void mix_areas2(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void mix_areas_32(unsigned int size, ++ volatile signed int *dst, signed int *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + register signed int sample, old_sample; + +@@ -112,8 +112,8 @@ static void mix_areas2(unsigned int size + + static void mix_select_callbacks(snd_pcm_direct_t *dmix) + { +- dmix->u.dmix.mix_areas1 = mix_areas1; +- dmix->u.dmix.mix_areas2 = mix_areas2; ++ dmix->u.dmix.mix_areas_16 = mix_areas_16; ++ dmix->u.dmix.mix_areas_32 = mix_areas_32; + } + + #else +@@ -122,14 +122,18 @@ static void mix_select_callbacks(snd_pcm + #define generic_dmix_supported_format \ + ((1ULL << SND_PCM_FORMAT_S16_LE) | (1ULL << SND_PCM_FORMAT_S32_LE) |\ + (1ULL << SND_PCM_FORMAT_S16_BE) | (1ULL << SND_PCM_FORMAT_S32_BE) |\ +- (1ULL << SND_PCM_FORMAT_S24_3LE)) ++ (1ULL << SND_PCM_FORMAT_S24_3LE) | \ ++ (1ULL << SND_PCM_FORMAT_U8)) + + #include + +-static void generic_mix_areas1_native(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void generic_mix_areas_16_native(unsigned int size, ++ volatile signed short *dst, ++ signed short *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) + { + register signed int sample; + +@@ -155,10 +159,13 @@ static void generic_mix_areas1_native(un + } + } + +-static void generic_mix_areas2_native(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void generic_mix_areas_32_native(unsigned int size, ++ volatile signed int *dst, ++ signed int *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) + { + register signed int sample; + +@@ -186,10 +193,13 @@ static void generic_mix_areas2_native(un + } + } + +-static void generic_mix_areas1_swap(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void generic_mix_areas_16_swap(unsigned int size, ++ volatile signed short *dst, ++ signed short *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) + { + register signed int sample; + +@@ -215,10 +225,13 @@ static void generic_mix_areas1_swap(unsi + } + } + +-static void generic_mix_areas2_swap(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void generic_mix_areas_32_swap(unsigned int size, ++ volatile signed int *dst, ++ signed int *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) + { + register signed int sample; + +@@ -247,10 +260,13 @@ static void generic_mix_areas2_swap(unsi + } + + /* always little endian */ +-static void generic_mix_areas3(unsigned int size, +- volatile unsigned char *dst, unsigned char *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void generic_mix_areas_24(unsigned int size, ++ volatile unsigned char *dst, ++ unsigned char *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) + { + register signed int sample; + +@@ -277,17 +293,47 @@ static void generic_mix_areas3(unsigned + } + } + ++static void generic_mix_areas_u8(unsigned int size, ++ volatile unsigned char *dst, ++ unsigned char *src, ++ volatile signed int *sum, ++ size_t dst_step, ++ size_t src_step, ++ size_t sum_step) ++{ ++ for (;;) { ++ register int sample = *src - 0x80; ++ if (*dst == 0x80) { ++ *sum = sample; ++ } else { ++ sample += *sum; ++ *sum = sample; ++ if (sample > 0x7f) ++ sample = 0x7f; ++ else if (sample < -0x80) ++ sample = -0x80; ++ } ++ *dst = sample + 0x80; ++ if (!--size) ++ return; ++ dst += dst_step; ++ src += src_step; ++ sum = (signed int *) ((char *)sum + sum_step); ++ } ++} ++ + + static void generic_mix_select_callbacks(snd_pcm_direct_t *dmix) + { + if (snd_pcm_format_cpu_endian(dmix->shmptr->s.format)) { +- dmix->u.dmix.mix_areas1 = generic_mix_areas1_native; +- dmix->u.dmix.mix_areas2 = generic_mix_areas2_native; ++ dmix->u.dmix.mix_areas_16 = generic_mix_areas_16_native; ++ dmix->u.dmix.mix_areas_32 = generic_mix_areas_32_native; + } else { +- dmix->u.dmix.mix_areas1 = generic_mix_areas1_swap; +- dmix->u.dmix.mix_areas2 = generic_mix_areas2_swap; ++ dmix->u.dmix.mix_areas_16 = generic_mix_areas_16_swap; ++ dmix->u.dmix.mix_areas_32 = generic_mix_areas_32_swap; + } +- dmix->u.dmix.mix_areas3 = generic_mix_areas3; ++ dmix->u.dmix.mix_areas_24 = generic_mix_areas_24; ++ dmix->u.dmix.mix_areas_u8 = generic_mix_areas_u8; + } + + #endif +diff -r 9e2f117f24b9 src/pcm/pcm_dmix_i386.c +--- a/src/pcm/pcm_dmix_i386.c Mon Oct 15 10:36:46 2007 +0200 ++++ b/src/pcm/pcm_dmix_i386.c Thu Dec 13 17:40:26 2007 +0100 +@@ -2,32 +2,32 @@ + * optimized mixing code for i386 + */ + +-#define MIX_AREAS1 mix_areas1 +-#define MIX_AREAS1_MMX mix_areas1_mmx +-#define MIX_AREAS2 mix_areas2 +-#define MIX_AREAS3 mix_areas3 +-#define MIX_AREAS3_CMOV mix_areas3_cmov ++#define MIX_AREAS_16 mix_areas_16 ++#define MIX_AREAS_16_MMX mix_areas_16_mmx ++#define MIX_AREAS_32 mix_areas_32 ++#define MIX_AREAS_24 mix_areas_24 ++#define MIX_AREAS_24_CMOV mix_areas_24_cmov + #define LOCK_PREFIX "" + #include "pcm_dmix_i386.h" +-#undef MIX_AREAS1 +-#undef MIX_AREAS1_MMX +-#undef MIX_AREAS2 +-#undef MIX_AREAS3 +-#undef MIX_AREAS3_CMOV ++#undef MIX_AREAS_16 ++#undef MIX_AREAS_16_MMX ++#undef MIX_AREAS_32 ++#undef MIX_AREAS_24 ++#undef MIX_AREAS_24_CMOV + #undef LOCK_PREFIX + +-#define MIX_AREAS1 mix_areas1_smp +-#define MIX_AREAS1_MMX mix_areas1_smp_mmx +-#define MIX_AREAS2 mix_areas2_smp +-#define MIX_AREAS3 mix_areas3_smp +-#define MIX_AREAS3_CMOV mix_areas3_smp_cmov ++#define MIX_AREAS_16 mix_areas_16_smp ++#define MIX_AREAS_16_MMX mix_areas_16_smp_mmx ++#define MIX_AREAS_32 mix_areas_32_smp ++#define MIX_AREAS_24 mix_areas_24_smp ++#define MIX_AREAS_24_CMOV mix_areas_24_smp_cmov + #define LOCK_PREFIX "lock ; " + #include "pcm_dmix_i386.h" +-#undef MIX_AREAS1 +-#undef MIX_AREAS1_MMX +-#undef MIX_AREAS2 +-#undef MIX_AREAS3 +-#undef MIX_AREAS3_CMOV ++#undef MIX_AREAS_16 ++#undef MIX_AREAS_16_MMX ++#undef MIX_AREAS_32 ++#undef MIX_AREAS_24 ++#undef MIX_AREAS_24_CMOV + #undef LOCK_PREFIX + + #define i386_dmix_supported_format \ +@@ -70,14 +70,14 @@ static void mix_select_callbacks(snd_pcm + } + + if (mmx) { +- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp_mmx : mix_areas1_mmx; ++ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp_mmx : mix_areas_16_mmx; + } else { +- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp : mix_areas1; ++ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp : mix_areas_16; + } +- dmix->u.dmix.mix_areas2 = smp > 1 ? mix_areas2_smp : mix_areas2; ++ dmix->u.dmix.mix_areas_32 = smp > 1 ? mix_areas_32_smp : mix_areas_32; + if (cmov) { +- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp_cmov : mix_areas3_cmov; ++ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp_cmov : mix_areas_24_cmov; + } else { +- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp: mix_areas3; ++ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp: mix_areas_24; + } + } +diff -r 9e2f117f24b9 src/pcm/pcm_dmix_i386.h +--- a/src/pcm/pcm_dmix_i386.h Mon Oct 15 10:36:46 2007 +0200 ++++ b/src/pcm/pcm_dmix_i386.h Thu Dec 13 17:40:26 2007 +0100 +@@ -29,10 +29,10 @@ + /* + * for plain i386 + */ +-static void MIX_AREAS1(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_16(unsigned int size, ++ volatile signed short *dst, signed short *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned int old_ebx; + +@@ -153,10 +153,10 @@ static void MIX_AREAS1(unsigned int size + /* + * MMX optimized + */ +-static void MIX_AREAS1_MMX(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_16_MMX(unsigned int size, ++ volatile signed short *dst, signed short *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned int old_ebx; + +@@ -243,10 +243,10 @@ static void MIX_AREAS1_MMX(unsigned int + /* + * for plain i386, 32-bit version (24-bit resolution) + */ +-static void MIX_AREAS2(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_32(unsigned int size, ++ volatile signed int *dst, signed int *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned int old_ebx; + +@@ -356,10 +356,10 @@ static void MIX_AREAS2(unsigned int size + /* + * 24-bit version for plain i386 + */ +-static void MIX_AREAS3(unsigned int size, +- volatile unsigned char *dst, unsigned char *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_24(unsigned int size, ++ volatile unsigned char *dst, unsigned char *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned int old_ebx; + +@@ -462,10 +462,10 @@ static void MIX_AREAS3(unsigned int size + /* + * 24-bit version for Pentium Pro/II + */ +-static void MIX_AREAS3_CMOV(unsigned int size, +- volatile unsigned char *dst, unsigned char *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_24_CMOV(unsigned int size, ++ volatile unsigned char *dst, unsigned char *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned int old_ebx; + +diff -r 9e2f117f24b9 src/pcm/pcm_dmix_x86_64.c +--- a/src/pcm/pcm_dmix_x86_64.c Mon Oct 15 10:36:46 2007 +0200 ++++ b/src/pcm/pcm_dmix_x86_64.c Thu Dec 13 17:40:26 2007 +0100 +@@ -2,24 +2,24 @@ + * optimized mixing code for x86-64 + */ + +-#define MIX_AREAS1 mix_areas1 +-#define MIX_AREAS2 mix_areas2 +-#define MIX_AREAS3 mix_areas3 ++#define MIX_AREAS_16 mix_areas_16 ++#define MIX_AREAS_32 mix_areas_32 ++#define MIX_AREAS_24 mix_areas_24 + #define LOCK_PREFIX "" + #include "pcm_dmix_x86_64.h" +-#undef MIX_AREAS1 +-#undef MIX_AREAS2 +-#undef MIX_AREAS3 ++#undef MIX_AREAS_16 ++#undef MIX_AREAS_32 ++#undef MIX_AREAS_24 + #undef LOCK_PREFIX + +-#define MIX_AREAS1 mix_areas1_smp +-#define MIX_AREAS2 mix_areas2_smp +-#define MIX_AREAS3 mix_areas3_smp ++#define MIX_AREAS_16 mix_areas_16_smp ++#define MIX_AREAS_32 mix_areas_32_smp ++#define MIX_AREAS_24 mix_areas_24_smp + #define LOCK_PREFIX "lock ; " + #include "pcm_dmix_x86_64.h" +-#undef MIX_AREAS1 +-#undef MIX_AREAS2 +-#undef MIX_AREAS3 ++#undef MIX_AREAS_16 ++#undef MIX_AREAS_32 ++#undef MIX_AREAS_24 + #undef LOCK_PREFIX + + #define x86_64_dmix_supported_format \ +@@ -55,7 +55,7 @@ static void mix_select_callbacks(snd_pcm + } + } + // printf("SMP: %i\n", smp); +- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp : mix_areas1; +- dmix->u.dmix.mix_areas2 = smp > 1 ? mix_areas2_smp : mix_areas2; +- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp : mix_areas3; ++ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp : mix_areas_16; ++ dmix->u.dmix.mix_areas_32 = smp > 1 ? mix_areas_32_smp : mix_areas_32; ++ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp : mix_areas_24; + } +diff -r 9e2f117f24b9 src/pcm/pcm_dmix_x86_64.h +--- a/src/pcm/pcm_dmix_x86_64.h Mon Oct 15 10:36:46 2007 +0200 ++++ b/src/pcm/pcm_dmix_x86_64.h Thu Dec 13 17:40:26 2007 +0100 +@@ -30,10 +30,10 @@ + /* + * MMX optimized + */ +-static void MIX_AREAS1(unsigned int size, +- volatile signed short *dst, signed short *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_16(unsigned int size, ++ volatile signed short *dst, signed short *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned long long old_rbx; + +@@ -125,10 +125,10 @@ static void MIX_AREAS1(unsigned int size + /* + * 32-bit version (24-bit resolution) + */ +-static void MIX_AREAS2(unsigned int size, +- volatile signed int *dst, signed int *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_32(unsigned int size, ++ volatile signed int *dst, signed int *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned long long old_rbx; + +@@ -240,10 +240,10 @@ static void MIX_AREAS2(unsigned int size + /* + * 24-bit version + */ +-static void MIX_AREAS3(unsigned int size, +- volatile unsigned char *dst, unsigned char *src, +- volatile signed int *sum, size_t dst_step, +- size_t src_step, size_t sum_step) ++static void MIX_AREAS_24(unsigned int size, ++ volatile unsigned char *dst, unsigned char *src, ++ volatile signed int *sum, size_t dst_step, ++ size_t src_step, size_t sum_step) + { + unsigned long long old_rbx; + diff -r 9e2f117f24b9 src/pcm/pcm_dshare.c --- a/src/pcm/pcm_dshare.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_dshare.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_dshare.c Thu Dec 13 17:40:26 2007 +0100 @@ -194,11 +194,8 @@ static int snd_pcm_dshare_sync_ptr(snd_p if (avail > dshare->avail_max) dshare->avail_max = avail; @@ -3952,7 +4610,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dshare.c diff -r 9e2f117f24b9 src/pcm/pcm_dsnoop.c --- a/src/pcm/pcm_dsnoop.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_dsnoop.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_dsnoop.c Thu Dec 13 17:40:26 2007 +0100 @@ -141,10 +141,7 @@ static int snd_pcm_dsnoop_sync_ptr(snd_p if (pcm->stop_threshold >= pcm->boundary) /* don't care */ return 0; @@ -3998,7 +4656,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_dsnoop.c diff -r 9e2f117f24b9 src/pcm/pcm_empty.c --- a/src/pcm/pcm_empty.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_empty.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_empty.c Thu Dec 13 17:40:26 2007 +0100 @@ -100,7 +100,8 @@ int _snd_pcm_empty_open(snd_pcm_t **pcmp err = snd_pcm_slave_conf(root, slave, &sconf, 0); if (err < 0) @@ -4011,7 +4669,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_empty.c } diff -r 9e2f117f24b9 src/pcm/pcm_ext_parm.h --- a/src/pcm/pcm_ext_parm.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_ext_parm.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_ext_parm.h Thu Dec 13 17:40:26 2007 +0100 @@ -19,6 +19,20 @@ static inline snd_interval_t *hw_param_i return ¶ms->intervals[var - SND_PCM_HW_PARAM_FIRST_INTERVAL]; } @@ -4035,7 +4693,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_ext_parm.h void snd_ext_parm_clear(struct snd_ext_parm *parm); diff -r 9e2f117f24b9 src/pcm/pcm_generic.h --- a/src/pcm/pcm_generic.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_generic.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_generic.h Thu Dec 13 17:40:26 2007 +0100 @@ -23,6 +23,82 @@ typedef struct { snd_pcm_t *slave; int close_slave; @@ -4121,7 +4779,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_generic.h int snd_pcm_generic_nonblock(snd_pcm_t *pcm, int nonblock); diff -r 9e2f117f24b9 src/pcm/pcm_ioplug.c --- a/src/pcm/pcm_ioplug.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_ioplug.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_ioplug.c Thu Dec 13 17:40:26 2007 +0100 @@ -313,7 +313,7 @@ static int snd_pcm_ioplug_hw_refine(snd_ if (err < 0) return err; @@ -4197,7 +4855,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_ioplug.c return 0; diff -r 9e2f117f24b9 src/pcm/pcm_local.h --- a/src/pcm/pcm_local.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_local.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_local.h Thu Dec 13 17:40:27 2007 +0100 @@ -226,6 +226,116 @@ struct _snd_pcm { void *private_data; struct list_head async_handlers; @@ -4353,7 +5011,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_local.h +} diff -r 9e2f117f24b9 src/pcm/pcm_multi.c --- a/src/pcm/pcm_multi.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_multi.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_multi.c Thu Dec 13 17:40:27 2007 +0100 @@ -690,13 +690,44 @@ static snd_pcm_sframes_t snd_pcm_multi_m return size; } @@ -4411,7 +5069,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_multi.c pcm->private_data = multi; diff -r 9e2f117f24b9 src/pcm/pcm_null.c --- a/src/pcm/pcm_null.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_null.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_null.c Thu Dec 13 17:40:27 2007 +0100 @@ -82,13 +82,10 @@ static int snd_pcm_null_status(snd_pcm_t static int snd_pcm_null_status(snd_pcm_t *pcm, snd_pcm_status_t * status) { @@ -4429,7 +5087,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_null.c return 0; diff -r 9e2f117f24b9 src/pcm/pcm_params.c --- a/src/pcm/pcm_params.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_params.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_params.c Thu Dec 13 17:40:27 2007 +0100 @@ -78,31 +78,14 @@ static inline int hw_is_interval(snd_pcm var <= SND_PCM_HW_PARAM_LAST_INTERVAL; } @@ -4470,7 +5128,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_params.c { diff -r 9e2f117f24b9 src/pcm/pcm_plugin.h --- a/src/pcm/pcm_plugin.h Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_plugin.h Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_plugin.h Thu Dec 13 17:40:27 2007 +0100 @@ -51,6 +51,16 @@ typedef struct { snd_atomic_write_t watom; } snd_pcm_plugin_t; @@ -4512,7 +5170,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_plugin.h int snd_pcm_linear_put_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format); diff -r 9e2f117f24b9 src/pcm/pcm_rate.c --- a/src/pcm/pcm_rate.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_rate.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_rate.c Thu Dec 13 17:40:27 2007 +0100 @@ -715,38 +715,6 @@ static snd_pcm_sframes_t snd_pcm_rate_fo return n; } @@ -4582,7 +5240,7 @@ diff -r 9e2f117f24b9 src/pcm/pcm_rate.c diff -r 9e2f117f24b9 src/pcm/pcm_share.c --- a/src/pcm/pcm_share.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_share.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_share.c Thu Dec 13 17:40:27 2007 +0100 @@ -914,7 +914,6 @@ static int snd_pcm_share_start(snd_pcm_t snd_pcm_share_t *share = pcm->private_data; snd_pcm_share_slave_t *slave = share->slave; @@ -4622,19 +5280,19 @@ diff -r 9e2f117f24b9 src/pcm/pcm_share.c pcm->running_areas, 0, diff -r 9e2f117f24b9 src/pcm/pcm_softvol.c --- a/src/pcm/pcm_softvol.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/pcm/pcm_softvol.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/pcm/pcm_softvol.c Thu Dec 13 17:40:27 2007 +0100 @@ -782,6 +782,8 @@ int snd_pcm_softvol_open(snd_pcm_t **pcm if (err > 0) { /* hardware control - no need for softvol! */ softvol_free(svol); *pcmp = slave; /* just pass the slave */ -+ if (!slave->name) ++ if (!slave->name && name) + slave->name = strdup(name); return 0; } diff -r 9e2f117f24b9 src/seq/Makefile.am --- a/src/seq/Makefile.am Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/seq/Makefile.am Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/seq/Makefile.am Thu Dec 13 17:40:27 2007 +0100 @@ -2,6 +2,9 @@ EXTRA_LTLIBRARIES=libseq.la libseq_la_SOURCES = seq_hw.c seq.c seq_event.c seqmid.c seq_midi_event.c \ @@ -4647,7 +5305,7 @@ diff -r 9e2f117f24b9 src/seq/Makefile.am all: libseq.la diff -r 9e2f117f24b9 src/seq/seq.c --- a/src/seq/seq.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/seq/seq.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/seq/seq.c Thu Dec 13 17:40:27 2007 +0100 @@ -2178,9 +2178,6 @@ void snd_seq_port_info_set_timestamp_que * - #SND_SEQ_PORT_TYPE_MIDI_GS GS compatible device * - #SND_SEQ_PORT_TYPE_MIDI_XG XG compatible device @@ -4926,7 +5584,7 @@ diff -r 9e2f117f24b9 src/seq/seq.c -} diff -r 9e2f117f24b9 src/seq/seq_event.c --- a/src/seq/seq_event.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/src/seq/seq_event.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/seq/seq_event.c Thu Dec 13 17:40:27 2007 +0100 @@ -37,12 +37,8 @@ const unsigned int snd_seq_event_types[2 = FIXED_EV(SND_SEQ_EVFLG_MESSAGE), [SND_SEQ_EVENT_PORT_SUBSCRIBED ... SND_SEQ_EVENT_PORT_UNSUBSCRIBED] @@ -4942,7 +5600,7 @@ diff -r 9e2f117f24b9 src/seq/seq_event.c [SND_SEQ_EVENT_USR_VAR0 ... SND_SEQ_EVENT_USR_VAR4] diff -r 9e2f117f24b9 src/seq/seq_old.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/src/seq/seq_old.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/src/seq/seq_old.c Thu Dec 13 17:40:27 2007 +0100 @@ -0,0 +1,222 @@ +/* + * place-holders to keep libasound linkable to old binaries @@ -5168,7 +5826,7 @@ diff -r 9e2f117f24b9 src/seq/seq_old.c +#endif /* !DOXYGEN */ diff -r 9e2f117f24b9 test/midiloop.c --- a/test/midiloop.c Mon Oct 15 10:36:46 2007 +0200 -+++ b/test/midiloop.c Fri Nov 30 18:33:19 2007 +0100 ++++ b/test/midiloop.c Thu Dec 13 17:40:27 2007 +0100 @@ -133,6 +133,8 @@ int main(int argc, char** argv) exit(EXIT_FAILURE); } diff --git a/alsa.changes b/alsa.changes index dc000d0..6c07972 100644 --- a/alsa.changes +++ b/alsa.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Dec 13 17:35:57 CET 2007 - tiwai@suse.de + +- updated to 2007.12.13 HG version: + * Fix segfault with softvol plugin + * Add support U8 format with dmix + ------------------------------------------------------------------- Fri Nov 30 18:22:34 CET 2007 - tiwai@suse.de diff --git a/alsa.spec b/alsa.spec index f1d30d4..7fcace6 100644 --- a/alsa.spec +++ b/alsa.spec @@ -21,7 +21,7 @@ PreReq: %insserv_prereq %fillup_prereq AutoReqProv: on Summary: Advanced Linux Sound Architecture Version: 1.0.15 -Release: 17 +Release: 19 Source: ftp://ftp.alsa-project.org/pub/lib/alsa-lib-%{package_version}.tar.bz2 Source8: 40-alsa.rules Source11: alsasound @@ -249,6 +249,10 @@ exit 0 %{_datadir}/alsa %changelog +* Thu Dec 13 2007 - tiwai@suse.de +- updated to 2007.12.13 HG version: + * Fix segfault with softvol plugin + * Add support U8 format with dmix * Fri Nov 30 2007 - tiwai@suse.de - updated to 2007.11.30 HG version * Fix Versions file to reduce unneeded exported symbols