[#37041] [ANN] Exerb/Exerb-CC 2.6.0 — Yuya Kato <yuya-ml@4th.to>

未踏ユース終了まで1ヶ月を切って、焦り気味のYuyaです。

27 messages 2003/02/02
[#37202] Re: [ANN] Exerb/Exerb-CC 2.6.0 — "TOYOFUKU Chikanobu" <toyofuku@...> 2003/03/02

豊福です。

[#37206] Re: [ANN] Exerb/Exerb-CC 2.6.0 — Yuya Kato <yuya-ml@4th.to> 2003/03/04

Yuyaです。

[#37058] Re: Local variables & blocks — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

27 messages 2003/02/05
[#37059] Re: Local variables & blocks — ichimal@... 2003/02/06

皆様、初めまして鈴木です。

[#37063] Re: Local variables & blocks — matz@... (Yukihiro Matsumoto) 2003/02/07

まつもと ゆきひろです

[#37110] Re: Local variables & blocks — ichimal@... 2003/02/16

鈴木です。

[#37115] Re: Local variables & blocks — Tanaka Akira <akr@...17n.org> 2003/02/17

In article <200302161629.h1GGTvJ5008901@fenix.ne.jp>,

[#37123] 私はこれにハマリました。 — Shin-ichiro HARA <sinara@...> 2003/02/18

原です。

[ruby-list:37157] Re: Ruby/SDL で複数の mpeg を扱うには

From: ohai@... (Ippei Obayashi)
Date: 2003-02-24 07:18:23 UTC
List: ruby-list #37157
こんにちは、大林です。

片多さん(katata@chugoku-pc.ac.jp)は書きました。

>> はじめまして、片多と申します。
>> Ruby/SDLをいろいろと試しているのですが、複数のmpegファイルをを扱ってみようと思い、
>> 以下のようなスクリプトを動かしてみると、
>> 
>> --
>> require 'sdl'
>> 
>> SDL.init( SDL::INIT_VIDEO|SDL::INIT_AUDIO )
>> screen = SDL.setVideoMode( 640, 480, 32, SDL::SWSURFACE )
>> 
>> mpeg1 = SDL::MPEG.load( 'A1_10a.mpg' )
>> mpeg2 = SDL::MPEG.load( 'A1_10b.mpg' ) # <- エラー!
>> 
>> mpeg1.setDisplay(screen)
>> mpeg1.play
>> 
>> loop do
>>   case event = SDL::Event2.poll
>>   when SDL::Event2::KeyDown
>>     mpeg1.stop
>>     exit
>>   end
>> end
>> --
>> 
>> 7行目の「mpeg2 =」の行で以下のようなエラーがでます。
>> 
>> --
>> plaympeg.rb:7:in `load': Couldn't load A1_10b.mpg: Audio device is already opened (SDL::Error)
>>         from plaympeg.rb:7
>> --
>> 
>> すでにオーディオデバイスは開いているよ、とのことですが、
>> どのようにすればよいのでしょうか。
>> 7行目をコメントにすればもちろん動画が再生されます。
>> 
>>
この問題に対処するパッチを作りました。
このパッチで以下のようなことが可能になるはずです。
* 複数のmpegファイルをロードし、再生すること
* SDL_mixerでの音声再生機能とmpegの再生機能を共存させること
* SDL_mixerで音声を再生しながらmpegで画像を音声なしで再生すること
  
ただし、このパッチには以下のような制限、注意点、問題点があります。
* mpegを音声つきで再生するためにはSDL.initを呼んだあとSDL::Mixer.openを
  呼ぶ必要がある
* mpegの音声の再生とSDL_mixerでの音声の再生を同時にすることはできない
* ふたつ以上のmpegを同時に再生することはできない
* 以上の制限にたいするチェックを一切していない
--
大林一平 ohai@kmc.gr.jp
         http://www.kmc.gr.jp/~ohai/

Attachments (1)

rubysdl.diff (2.08 KB, text/x-diff)
diff -u -r1.5 rubysdl_smpeg.c
--- rubysdl_smpeg.c	11 May 2002 17:23:29 -0000	1.5
+++ rubysdl_smpeg.c	24 Feb 2003 04:14:16 -0000
@@ -20,6 +20,7 @@
 #ifdef HAVE_SMPEG
 #include "rubysdl.h"
 #include "smpeg/smpeg.h"
+#include "SDL_mixer.h"
 
 static SMPEG_Filter* filters[3];
 #define NULL_FILTER 0
@@ -46,18 +47,20 @@
 static VALUE smpeg_load(VALUE class,VALUE filename)
 {
   SMPEG *mpeg;
-  VALUE infoObj;
+  VALUE obj;
   char error_msg[2048];
     
-  mpeg = SMPEG_new(STR2CSTR(filename),NULL,SDL_WasInit(SDL_INIT_AUDIO));
+  mpeg = SMPEG_new(STR2CSTR(filename),NULL,0);
   if( SMPEG_error(mpeg) ){
     snprintf(error_msg,sizeof(error_msg),"Couldn't load %s: %s",
 	     STR2CSTR(filename),SMPEG_error(mpeg));
     SMPEG_delete(mpeg);
     rb_raise(eSDLError,"%s",error_msg);
   }
-  
-  return Data_Wrap_Struct(cMPEG,0,SMPEG_delete,mpeg);
+
+  obj = Data_Wrap_Struct(cMPEG,0,SMPEG_delete,mpeg);
+  rb_iv_set(obj,"enable_audio",Qfalse);
+  return obj;
 }
 
 static VALUE smpeg_getInfo(VALUE obj,VALUE infoObj)
@@ -80,6 +83,7 @@
   SMPEG *mpeg;
   Data_Get_Struct(obj,SMPEG,mpeg);
   SMPEG_enableaudio(mpeg,RTEST(enable));
+  rb_iv_set(obj,"enable_audio",enable);
   return Qnil;
 }
 
@@ -163,7 +167,32 @@
 static VALUE smpeg_play(VALUE obj)
 {
   SMPEG *mpeg;
+  int use_audio;
+  
   Data_Get_Struct(obj,SMPEG,mpeg);
+
+  use_audio = RTEST(rb_iv_get(obj,"enable_audio")) &&
+    Mix_QuerySpec( NULL, NULL, NULL );
+
+  if( use_audio ){
+    SDL_AudioSpec audiofmt;
+    Uint16 format;
+    int freq, channels;
+    
+    SMPEG_enableaudio(mpeg, 0);
+    /* Tell SMPEG what the audio format is */
+    Mix_QuerySpec(&freq, &format, &channels);
+    audiofmt.format = format;
+    audiofmt.freq = freq;
+    audiofmt.channels = channels;
+    SMPEG_actualSpec(mpeg, &audiofmt);
+
+    /* Hook in the MPEG music mixer */
+    Mix_HookMusic(NULL,NULL);
+    Mix_HookMusic(SMPEG_playAudioSDL, mpeg);
+    SMPEG_enableaudio(mpeg, 1);
+  }
+    
   SMPEG_play(mpeg);
   return Qnil;
 }
@@ -181,6 +210,7 @@
   SMPEG *mpeg;
   Data_Get_Struct(obj,SMPEG,mpeg);
   SMPEG_stop(mpeg);
+  Mix_HookMusic(NULL,NULL);
   return Qnil;
 }
 

In This Thread