Bug 156832 - No PCM detection when saved session
Summary: No PCM detection when saved session
Status: RESOLVED INTENTIONAL
Alias: None
Product: kmix
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: Gentoo Packages Linux
: NOR normal
Target Milestone: ---
Assignee: Christian Esken
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-01-28 04:08 UTC by Seblu
Modified: 2008-05-31 10:35 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Seblu 2008-01-28 04:08:47 UTC
Version:           2.6.1 (using KDE 3.5.7)
Installed from:    Gentoo Packages
Compiler:          gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.2) 
OS:                Linux

When i start my session, kmix start whithout detect pcm channel. After kde loading, if i close "manually" kmix and start it again, PCM channel is present.

I found this bug, because my PCM channel have the device id 0, so when KDE start, kmix restore sound on/off status and volume by device offset. My volume are shifted by one to left. :(
Comment 1 Christian Esken 2008-01-29 10:17:48 UTC
There are two issues described here:
1) "pcm channel not detected". I would say that this is an ALSA bug. Please try something:
a) Reboot your computer, and Login. Is the issue present?
b) Logout (WITHOUT! rebooting). Login again. Is the issue present?

Please report back.

2) "Shifted controls restore issue". This is usually only problematic after soundcard-driver updates, and even there only very occasionaly. This is a known bug in KMix V2.x (KDE3), and cannot be fixed there. It has been fixed in KDE4.0.
Comment 2 Seblu 2008-01-31 17:58:51 UTC
There are two issues described here:
1) "pcm channel not detected". I would say that this is an ALSA bug. Please try something:
a) Reboot your computer, and Login. Is the issue present?
yes

b) Logout (WITHOUT! rebooting). Login again. Is the issue present?
yes

2) "Shifted controls restore issue". This is usually only problematic after soundcard-driver updates, and even there only very occasionaly. This is a known bug in KMix V2.x (KDE3), and cannot be fixed there. It has been fixed in KDE4.0. 
yes, this is not a problem when soundcard drivers are updated. But in my case, no update would be done.
Comment 3 Christian Esken 2008-01-31 21:10:35 UTC
Hmmm, this is getting very strange. I am running out of ideas, but here is one last thing:
Could you try to disable the KMix volume restauration? Perhaps its some weird issue with volume change events rushing into KMix at the wrong time (early during initialization). Looking at the KMix code I would say that this should not be a problem, but well. Lets just try it please.
Comment 4 Seblu 2008-02-01 00:56:56 UTC
Could you try to disable the KMix volume restauration? Perhaps its some weird issue with volume change events rushing into KMix at the wrong time (early during initialization). Looking at the KMix code I would say that this should not be a problem, but well. Lets just try it please. 

Yes, this change nothing. First start without PCM device and after a kmix restart PCM come back. This only difference is the volume which is correctly set after the second start.

I have do some more test and if i start the "alsasound" script at gentoo starting, kmix start correctly (with or whithout saving the sound volume). So PCM is always present and they are no problem. This script only do an alsactl restoration (i can send you if you want).

This solve my problem but kmix behaviour is not good if volume is not previously  restored (or acceded) by some alsa-utils.
Comment 5 Christian Esken 2008-02-01 10:52:13 UTC
I would like to se the script. Comments from the Internet indicate, that it does more, like loading the sound driver (explicitly or implicitly). If it does, I am pretty sure that this is an ALSA bug.
Comment 6 Seblu 2008-02-06 00:37:36 UTC
yes it can do more, but me I use it with this options :

$ cat /etc/conf.d/alsasound                                                                                                                                                                     (0:35)[0]
# ENABLE_OSS_EMUL:
# Do you want to enable in-kernel oss emulation?
# no - Do not load oss emul drivers
# yes - Load oss emul drivers if they're found

ENABLE_OSS_EMUL="no"

# RESTORE_ON_START:
# Do you want to restore your mixer settings?  If not, your cards will be
# muted.
# no - Do not restore state
# yes - Restore state

RESTORE_ON_START="yes"

# SAVE_ON_STOP:
# Do you want to save changes made to your mixer volumes when alsasound
# stops? 
# no - Do not save state
# yes - Save state

SAVE_ON_STOP="yes"

# LOAD_ON_START:
# Do you want to load sound modules when alsasound starts?
# no - Do not load modules
# yes - Load modules
LOAD_ON_START="no"

# UNLOAD_ON_STOP:
# Do you want to unload sound modules when alsasound stops?
# no - Do not unload modules
# yes - Unload modules
UNLOAD_ON_STOP="no"

And the script is :

#!/sbin/runscript
# $Header: /var/cvsroot/gentoo-x86/media-sound/alsa-utils/files/alsasound.initd,v 1.6 2007/12/29 06:37:59 robbat2 Exp $
# Copyright 2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

alsastatedir=/var/lib/alsa
alsascrdir=/etc/alsa.d

opts="save restore"

depend() {
        need localmount
        after bootmisc modules isapnp coldplug hotplug
}

load_modules() {
        # List of drivers for each card.
        local DRIVERS="$(modprobe -c | sed -n -e 's/^alias \(snd-card-[[:digit:]]\+\) .*/\1/p')"

        # Fall back on the automated aliases if we don't have ALSA configured properly...
        if [ -z "${DRIVERS}" ] && \
        ( [ ! -r /proc/asound/cards ] || grep -q ' no soundcards ' /proc/asound/cards 2>/dev/null ) ; then
                ewarn "Could not detect custom ALSA settings.  Loading all detected alsa drivers."
                DRIVERS="$(modprobe -c | sed -n -e '/^alias pci:.* snd.*/ s/^alias pci:[^ ]* \(.*\)/\1/p' | sort | uniq)"
                if [ -z "${DRIVERS}" ] ; then
                        eerror "Unable to find any ALSA drivers. Have you compiled alsa-drivers correctly?"
                fi
        fi

        if [ "${ENABLE_OSS_EMUL}" = "yes" ] ; then
                DRIVERS="${DRIVERS} $(modprobe -l | sed -n -e '/snd.*oss/ s:\/.*\/\(.*\).ko:\1:p')"
        fi

        # We want to ensure snd-seq is loaded as it is needed for things like
        # timidity even if we don't use a real sequencer.
        DRIVERS="${DRIVERS} $(modprobe -l | sed -n -e '/snd.seq\./ s:\/.*\/\(.*\).ko:\1:p')"

        # We want to ensure snd-ioctl32 is loaded as it is needed for 32bit
        # compatibility
        DRIVERS="${DRIVERS} $(modprobe -l | sed -n -e '/snd.ioctl32\./ s:\/.*\/\(.*\).ko:\1:p')"

        local DRIVER= DMOD=
        for DRIVER in ${DRIVERS} ; do
                [ "${DRIVER}" = "off" ] && continue
                DMOD="$(echo "${DRIVER}" | sed -e 's/-/_/g')"
                if ! grep -q "^${DMOD} " /proc/modules ; then
                        ebegin "Loading: ${DRIVER}"
                        modprobe ${DRIVER}
                        eend $?
                fi
        done

        if [ -f /proc/asound/seq/drivers ] ; then
                local SEQUENCERS="$(sed -n -e 's/\([^,]*\),empty,.*/\1/p' /proc/asound/seq/drivers)"
                local SEQUENCER
                for SEQUENCER in ${SEQUENCERS} ; do
                        DMOD="$(echo "${SEQUENCER}" | sed -e 's/-/_/g')"
                        if ! grep -q "^${DMOD} " /proc/modules ; then
                                ebegin "Loading: ${SEQUENCER}"
                                modprobe ${SEQUENCER}
                                eend $?
                        fi
                done
        fi

        for DRIVER in ${DRIVERS}
        do
                local TMP=${DRIVER##snd-}
                TMP=${TMP##snd_}
                if [ -x "${alsascrdir}/${TMP}" ] ; then
                        ebegin "Running: ${alsascrdir}/${TMP}"
                        "${alsascrdir}/${TMP}"
                        eend $?
                fi
        done

        if [ ! -d /proc/asound ] || grep -q ' no soundcards ' /proc/asound/cards ; then
                eerror "ERROR: Failed to load necessary drivers"
                return 1
        fi
}

unload_modules_24() {
        local LOADED_MODULES="$(lsmod | sed -n -e 's/^\(snd[^ ]*\) .*/\1/p')"
        local MODULE
        for MODULE in ${LOADED_MODULES} ; do
            rmmod "${MODULE}"
        done
        rmmod soundcore 2>/dev/null
        rmmod gameport 2>/dev/null

        lsmod | grep -vq '^snd'
}

unload_modules_recursive() {
        local revdeps="$(lsmod | sed -n -e "s/,/ /g" -e "s/^$1 *[0-9]* *[0-9]* \(.*\)/\1/p")"

        for module in ${revdeps} ; do
                unload_modules_recursive "${module}"
        done

        vebegin "Unloading: $1"
        rmmod --wait "$1"
        veend $?
}

unload_modules_26() {
        # First of all, remove the snd module and all the modules depending
        # on it, this should remove already most of ALSA modules.
        lsmod | grep -q "^snd[[:space:]]" && unload_modules_recursive snd

        # Then find the remaining ones, and handle them too.
        for module in $(lsmod | sed -n -e 's/^\(snd[^ ]*\) .*/\1/p'); do
                unload_modules_recursive "${module}"
        done

        lsmod | grep -vq "^snd"
}

terminate() {
        #
        # Kill processes holding open sound devices
        #
        # DEVS=`find /dev/ -follow -type c -maxdepth 1 -print 2>/dev/null | xargs ls -dils | grep "1*1[46]," | cut -d: -f2 | cut -d" " -f2; echo /proc/asound/dev/*`
        local ossdevs="/dev/admmidi* /dev/adsp* /dev/amidi* /dev/audio* /dev/dmfm* \
                        /dev/dmmidi* /dev/dsp* /dev/dspW* /dev/midi0* /dev/mixer* /dev/music \
                        /dev/patmgr* /dev/sequencer* /dev/sndstat"
        local alsadevs="/proc/asound/dev/* /dev/sound/* /dev/snd/*"
        fuser -k ${ossdevs} ${alsadevs} >/dev/null 2>/dev/null

        # remove all sequencer connections if any
        [ -f /proc/asound/seq/clients ] && type aconnect >/dev/null 2>/dev/null && aconnect --removeall
}

restore() {
        ebegin "Restoring Mixer Levels"

        if [ ! -r "${alsastatedir}/asound.state" ] ; then
                ewarn "No mixer config in ${alsastatedir}/asound.state, you have to unmute your card!"
                eend 0
                return 0
        fi

        local cards="$(sed -n -e 's/ *\([[:digit:]]*\) .*/\1/p' /proc/asound/cards)"
        local CARDNUM
        for cardnum in ${cards}; do
                [ -e /dev/snd/controlC${cardnum} ] || sleep 2
                [ -e /dev/snd/controlC${cardnum} ] || sleep 2
                [ -e /dev/snd/controlC${cardnum} ] || sleep 2
                [ -e /dev/snd/controlC${cardnum} ] || sleep 2
                alsactl -f "${alsastatedir}/asound.state" restore ${cardnum} \
                        || ewarn "Errors while restoring defaults, ignoring"
        done

        for ossfile in "${alsastatedir}"/oss/card*_pcm* ; do
                [ -e "${ossfile}" ] || continue
                # We use cat because I'm not sure if cp works properly on /proc
                local procfile=${ossfile##${alsastatedir}/oss}
                procfile="$(echo "${procfile}" | sed -e 's,_,/,g')"
                if [ -e /proc/asound/"${procfile}"/oss ] ; then
                    cat "${ossfile}" > /proc/asound/"${procfile}"/oss 
                fi
        done

        eend 0
}

save() {
        ebegin "Storing ALSA Mixer Levels"

        mkdir -p "${alsastatedir}"
        if ! alsactl -f "${alsastatedir}/asound.state" store; then
                eerror "Error saving levels."
                eend 1
                return 1
        fi

        for ossfile in /proc/asound/card*/pcm*/oss; do
                [ -e "${ossfile}" ] || continue
                local device=${ossfile##/proc/asound/} ; device=${device%%/oss}
                device="$(echo "${device}" | sed -e 's,/,_,g')"
                mkdir -p "${alsastatedir}/oss/"
                cp "${ossfile}" "${alsastatedir}/oss/${device}"
        done

        eend 0
}

start() {
        if [ -f /proc/modules ] && [ "${LOAD_ON_START}" = "yes" ]; then
                ebegin "Loading ALSA modules"
                eindent
                load_modules
                eoutdent
                eend $? || return 1
        fi

        if [ ! -d /proc/asound ]; then
                eerror "ALSA failed to load."
                eend 1
                return 1
        fi

        [ "${RESTORE_ON_START}" = "yes" ] && restore

        return 0
}

stop() {
        if [ ! -d /proc/asound ] ; then
                eerror "ALSA is not loaded"
                return 0
        fi

        [ "${SAVE_ON_STOP}" = "yes" ] && save

        ebegin "Killing processes using ALSA"
        terminate
        eend 0
        
        if [ -f /proc/modules ] && [ "${UNLOAD_ON_STOP}" = "yes" ]; then
                local ver="24"
                rmmod --version | grep -q module-init-tools && ver="26"

                ebegin "Unloading ALSA modules"
                eindent
                unload_modules_${ver}
                eend $?
                eoutdent
        fi

        return 0
}
Comment 7 Seblu 2008-02-06 00:39:49 UTC
in my case, it only call restore function, and this do only an alsactl restore.
Comment 8 Christian Esken 2008-05-18 19:40:36 UTC
I really have not an idea what could be the reason here. It is VERY unlikely that I will be able to find that without the possibility to reproduce it.

As KDE4 is out for some time, I won't put any additonal effort for this in KDE3. In KDE4's KMix ALSA handling has improved, and I can only hope that is fixed there.

Do you have a chance to run a KDE4 version (directly, Live-CD, or whatever)?
Comment 9 Seblu 2008-05-25 16:40:58 UTC
No i don't have try with kde4.0 on this computer, i wait kde4.1 to switch from 3.5.

But, don't spread more time to fix this bug. WHen i start gentoo script, problem is not revelent.

Thanks for your work !
Comment 10 Christian Esken 2008-05-31 10:35:52 UTC
Not fixed. Probably fixed/irrelevant in KDE4. Closing in agreement with bug reporter, as there is a workaround.