/etc/init.d/alsa

4.X系のバグ、トラブル

モデレータ: 暇人, YoN, nyu

返信する
skunk977
記事: 2
登録日時: 10/02/10(水) 21:17

/etc/init.d/alsa

投稿記事 by skunk977 »

どうも、はじめまして。

さっそくですが4.3.1の/etc/init.d/alsaの8行目

コード: 全て選択

  if [ "`lsmod | grep '^snd_'`" != "" ];then
この条件式は逆でしょ。
再起動したら音が出ない類のトラブルはこれが原因と思われます。

(ちなみに以前のバージョンだと/etc/rc.d/rc.services)

以上、ちょっと気になりましたので・・・
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

Re: /etc/init.d/alsa

投稿記事 by シノバー »

skunk977 さんが書きました:この条件式は逆でしょ。
再起動したら音が出ない類のトラブルはこれが原因と思われます。
「逆」なのかなあ?
というのは、現在この論理で動いてますから。

この論理を逆にするとうまくいったという例があるのでしょうか?

この条件式は必要ないのかもしれませんが、そもそもサウンド機能の無いハードではスルーしたいという意図ではないでしょうか。
つまり、サウンド機能があってカーネルが認識するなら snd_ なんとかのモジュールは読み込まれているはず。でも一部モジュール (snd-mixer-oss, snd-seq-oss, snd-pcm-oss の3つ)は読み込まれないケースがあるので念押しで modprobe する……みたいにコメントは読めます。
#sometimes these don't all load...
The bar master, Shino's Bar
http://shinobar.net/
skunk977
記事: 2
登録日時: 10/02/10(水) 21:17

Re: /etc/init.d/alsa

投稿記事 by skunk977 »

そういわれてみれば確かにそうなんでちょっと早とちりだったかもしれません。
「条件式が逆」ってのは取り下げます。

しかし
シノバー さんが書きました: つまり、サウンド機能があってカーネルが認識するなら snd_ なんとかのモジュールは読み込まれているはず。
この仮定は間違ってます。
いや、そういうsnd_*のモジュールが既に読み込まれてるPCがあるのも確認しましたが
そうでないPCもまた確認しました。(うちにあるdaynabook satellite 2210)
サウンド機能があってなおかつスクリプト実行時にサウンド関係のモジュールが読み込まれないPCに対して
現状では対処できないですし
過去に報告されているミキサーまわりのトラブルの一因なってると思われます。
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

Re: /etc/init.d/alsa

投稿記事 by シノバー »

いまさらですが、Barryさんが /etc/init.d/alsa に手を加えました。
http://bkhome.org/blog/?viewDetailed=01960

モジュールが読み込まれるまで Sleepで待つというだけのことみたい?
The bar master, Shino's Bar
http://shinobar.net/
アバター
シノバー
記事: 3139
登録日時: 09/03/21(土) 00:05
連絡する:

/etc/init.d/alsa の改良

投稿記事 by シノバー »

Wary-500など最近のwoofではサウンドカードの認識についてBaryさんの改良が加えられています。
Baryさんのものは rc.servicesで複数カードの認識などに工夫が凝らされていますが、その部分を横に置いて私なりの改良を/etc/init.d/alsaに加えてみました。
複数カード、たとえば内蔵PCIと外付けUSBサウンドなどの条件でも問題なく動作するかどうか不明です。みなさんのテスト報告をお待ちします。
EDIT: 2011.01.12修正 - 70行目(?)の 'fi' を外しました。

コード: 全て選択

#!/bin/sh
#Barry Kauler april 2009, puppylinux.com
#called from /etc/rc.d/rc.services at bootup, with 'start' param.
#called from /etc/rc.d/rc.shutdown at shutdown, with 'stop' param.
#101120, 101121 simplification.
# 11jan11 shinobar: wait the device node created, save to /etc/asound.state on success

case "$1" in
 start)
  # shinobar: wait sound drivers loaded
  GOOD=""
  for I in $(seq 8); do
    [ "`lsmod | grep '^snd_'`" != "" ] && GOOD="yes" && break
    sleep 1
  done
  [ "$GOOD" != "" ] || exit
   rm -f /var/lock/subsys/alsasound 2> /dev/null #or alsa will not start.
   #sometimes these don't all load...
   modprobe snd-mixer-oss
   modprobe snd-seq-oss
   modprobe snd-pcm-oss
   # shinobar: wait the device node created
   GOOD=""
   for I in $(seq 4); do
     [ -c /dev/mixer ] && GOOD="yes" && break
     sleep 1
   done
   [ "$GOOD" != "" ] || exit
   touch /tmp/rc_d_rc_services_alsa_ok # shinobar: delayedrun may use it (precaution/compatibility)
   if [ ! -f /etc/asound.state ];then
    #try and set all levels workable...
    #set_mixers #in functions4puppy4
    #101015 BK had to add ,0 after Front...
	amixer -s -q <<EOF
set Master 75% unmute
set Master -12dB
set 'Master Mono' 75% unmute
set 'Master Mono' -12dB
set Front,0 75% unmute
set Front,0 -12dB
set PCM 90% unmute
set PCM 0dB
set Synth 90% unmute
set Synth 0dB
set CD 90% unmute
set CD 0dB
set Mic 0% mute
set PCM,1 90% unmute
set PCM,1 0dB
set Wave 100% unmute
set Music 100% unmute
set AC97 100% unmute
set 'Master Digital' 75% unmute
set DAC 90% unmute
set DAC -12dB
set DAC,0 90% unmute
set DAC,0 -12dB
set DAC,1 90% unmute
set DAC,1 -12dB
set Headphone 75% unmute
set Headphone -12dB
set Playback 100% unmute
set "SB Live Analog/Digital Output Jack" off
set "Audigy Analog/Digital Output Jack" off
EOF
   [ $? -eq 0 ] && alsactl -f /etc/asound.state store  # shinobar	
   else
    alsactl -f /etc/asound.state restore #from /etc/asound.state.
   fi
 ;;
 stop)
  [ -f /etc/asound.state ] && alsactl -f /etc/asound.state store #saves to /etc/asound.state.  # shinobar
  # Kill processes holding open sound devices...
  fuser -k /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 >/dev/null 2>&1
  [ -d /proc/asound/dev ] && fuser -k /proc/asound/dev/* >/dev/null 2>&1
  [ -d /dev/snd ] && fuser -k /dev/snd/* >/dev/null 2>&1
  # remove all sequencer connections if any
  [ -f /proc/asound/seq/clients -a -x aconnect ] && aconnect --removeall
  # mute master to avoid clicks at unload
  amixer set Master mute >/dev/null 2>&1
  # remove all sound modules
  lsmod | grep "^snd" | grep -Ev "(snd-page-alloc|snd_page_alloc)" |
  while read line
  do
     rmmod `echo $line | cut -d ' ' -f 1`
  done
  # remove the 2.2 soundcore module (if possible)
  rmmod soundcore 2> /dev/null
  rmmod gameport 2> /dev/null
  # remove lockfile if lockdir exists
  [ -d /var/lock/subsys ] && rm -f /var/lock/subsys/alsasound
 ;;
esac

###END###
/etc/init.d/alsaを上記のものに書き換えて実行属性を付けてください。
いったん /etc/alsa.state(があれば)を削除し、PCを再起動してみてください。

いずれのバージョンのPuppyでも動作するはずですが、最近のPuppyでは /etc/init.d/alsa ではなく /etc/init.d/10alsa という名前になっているかもしれません。
The bar master, Shino's Bar
http://shinobar.net/
返信する