[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:32112] Re: wav ファイルを鳴らすパッケージについて



佐野@浜松です。

In <20020320.211410.102019246.hiramoto@xxxxxxxxxxx>,
  on "Wed, 20 Mar 2002 21:14:11 +0900',
   with "[debian-users:32111] Re: wavファイルを鳴らすパッケージについて",
 HIRAMOTO Kouji <debian-users@xxxxxxxxxxx> さん wrote:

> 平本です。

御無沙汰してます

> In subject: [debian-users:32049] wav ファイルを鳴らすパッケージについて
> 	murakawa@xxxxxxxxxxxxx ("Takanori") said:
> 
> > 今は、例えば100秒鳴らす場合
> > ループで何度も wavp を実行し、他のプロセスが100秒カウントし
> > 無理やり kill しています。
> > しかしそうすると、killしても1サイクル分はどうしても
> > 鳴ってしまうようです。
> 
>   目覚し時計代わりに MP3 を mpg123 で再生させて、あるトリガーで
> kill するようにしていますが、ちゃんと kill した瞬間に音が止まりま
> す。その wavp というプログラムの特性ではないでしょうか? あるいは
> kill -KILL だったら止まってくれるとか。

調べてみたら自分の potato システムにも wavp (wavtools) が
インストールされていたので試してみましたが、コンソールから
起動すれば ctrl-C した瞬間に止まります。

> > ループで何度も wavp を実行し、他のプロセスが100秒カウントし
> > 無理やり kill しています。

の処理が狙いどおりに動いていない、ということではないかと。

ちょっと試してみたんですが、

(:
while true
  do
    wavp $WAVFILE >/dev/null 2>&1
  done
) &
:
sleep "$DURATION"
kill $!
sleep 1
echo "done!"
exit 0

みたいにしただけだと、 ( ) で起動されたサブシェルは kill $! で
終了させられるが wavp はプロセスが別なので最後まで演奏を完了して
終わりますね。

たぶん、上記と似たようなことをしたのではないでしょうか。

(:
while true
  do
    wavp $WAVFILE >/dev/null 2>&1
  done
) &
:
sleep "$DURATION"
kill $!
fuser -k /dev/dsp
sleep 1
echo "done!"
exit 0

のように、fuser -k /dev/dsp を追加してやれば kill $! で
 ( ) 内のサブシェルが終了した後で /dev/dsp を握っている
 wavp のプロセスも終了させてくれるので (この順序が逆だと
 wavp が終了した時点で次の演奏を ( ) 内のサブシェルが
始めてしまう)「指定した時間どおりに終了」という期待に
沿った形が実現できるのではないかと。

お遊びで作ってみたスクリプトをおまけに付けときます。
お試し用にタイマーを 300 秒までに限定してますから、
もっと長いのが欲しかったら適当にいじくってください。

  ==== loopsound.sh ====
#!/bin/sh
if [ -z "$2" ]
  then
    echo "usage: loopsound.sh wavfile duration(sec)"
    exit -1
fi

WAVFILE=$1
export WAVFILE
DURATION=$2

if [ ! -r "$WAVFILE" ]
  then
    echo "can not read wavfile: $WAVFILE"
    exit -1
fi

if [ "$DURATION" -le 0 -o "$DURATION" -ge "300" ]
  then
    echo "duration exceeds limit (from 1 to 300)"
    exit -1
fi

function abort()
{
kill $!; fuser -k /dev/dsp; /bin/sleep 1; exit -1;
}

function play()
{
trap 'abort' 1 2 3 6 9 15
(:
while true
  do
    wavp $WAVFILE >/dev/null 2>&1
  done
) 2>/dev/null &
:
sleep "$DURATION"
kill $!
fuser -k /dev/dsp
sleep 1
echo "done!"
exit 0
}

play
  ==== loopsound.sh ====

-- 
 # まぁこんなもんでしょ。fuser で止めるのが手軽で便利そう。
   <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)