[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 (佐野 武俊)