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

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



村川と申します。
平本さん、佐野さん、ありがとうございます。
スクリプトまで作っていただきすいません。m(__)m
試してみたところ、音が途中で切れることを確認できました。
ありがとうございました。

> 佐野@浜松です。
>
> 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 (佐野 武俊)
>
>