ExternalInterfaceで送れるデータの限界&全ブラウザ対応のブラクラができた

最初はブラクラなんてつくる気無かったんですが。
今度ExternalInterfaceを使って最大kBオーダーのテキストをjavascript→Flashに渡すようなアプリをつくるかもしれなくて、
ExternalInterface.addCallbackの限界を試したかったんです。
その結果は、IE7、FF2ともに 33,554,432[Byte]まではokだった。
その2倍はNG。IE7,FF2ともにメモリが不足しています、っていってjsがエラーる。
へー。
そしたらExternalInterface.callでFlash→javascriptにどんだけ渡せるのか試したくなる。
16,777,216[Byte]まではok。その2倍はIE7,FF2ともにNG。Flash側でメモリが足りなくなるようで、
IE7,FF2ともに終了。
へーへー。
Opera9.*,Safari3(Windows)も死亡
macは試してない
しかし、意外とたくさん送れるもんだなぁ。
検証コードはこんな
actionscript3
PLAIN TEXT
Actionscript:

package {

    import flash.display.Sprite;

    import flash.system.Security;

    import flash.external.ExternalInterface;

    import flash.utils.setTimeout;

    public class RPCClient extends Sprite{

        private var debug :Boolean = true;

        Security.allowDomain('*');

 

        public function RPCClient(){

            ExternalInterface.addCallback("xi_send", xi_send);

            var message [...]

speex+portaudioを使ったechoアプリを書いてみた

マイク → speexエンコーダ → speexデコーダ → スピーカー
だけの。
speexエンコーダ、speexデコーダ無しだと問題ないところ、ありにすると、
なんか高音のノイズが入るのはなぜ?
speex-devのMLに質問中。。。
コードはこんな
PLAIN TEXT
C++:

#include "stdafx.h"

 

#include <queue>

#include <iostream>

 

#include <portaudio .h>

#include <speex /speex.h>

#include </speex><speex /speex_callbacks.h>

 

 

#define USE_SPEEX

 

 

#define SAMPLE_RATE  (44100)

#define FRAMES_PER_BUFFER (256)

#define NUM_SECONDS     (10)

//#define NUM_CHANNELS    (2)

#define NUM_CHANNELS    (1) // try mono first

/* #define DITHER_FLAG     (paDitherOff) */

#define DITHER_FLAG     (0) /**/

 

/* Select sample format. */

#define PA_SAMPLE_TYPE  paFloat32

typedef float SAMPLE;

#define SAMPLE_SILENCE  (0.0f)

#define PRINTF_S_FORMAT "%.8f"

 

typedef [...]

libjingleでportaudioを使ったmediaengineをつくった

置いておこう。
portaudioが、マイクからデータが取れたとき、スピーカーに音を流せるとき、にcallbackを呼んでくれる形なので、
・マイクから音をとってくるところ
・スピーカーに音を流すところ
にバッファを持っている。
覚えたてのC++のSTLの明示的cast、queueを使っています。
C++おもろいなー
libjingleが確保してくれたP2Pセッションに音声データを流すときに、
PLAIN TEXT
CODE:

network_interface_->SendPacket(const void*, size_t);

ってのを呼ぶんだけど、
queueをconst void*に変換するとこが気持ち悪い。こんなもんなのかなぁ
音声は生のwavを送っているので、遅延は
DirectAudioを使ってたらそこで50msくらい(らしい?)
+バッファ分の遅延、
+portaudioの遅延
+通信の遅延
くらいなのかな。なんか体感かなり遅延してるのは後で調べる。
portaudiomediaengine.cc
PLAIN TEXT
C++:

#include "talk/third_party/mediastreamer/mediastream.h"

#include <fcntl .h>

#include <iostream>

#include "talk/base/logging.h"

#include "talk/base/thread.h"

#include "talk/session/phone/codec.h"

#include "talk/session/phone/portaudiomediaengine.h"

 

#include <sstream>

#include <iostream>

#include <iomanip>

#include <string>

#include <queue>

#include "portaudio.h"

#include <time .h>

 

using namespace cricket;

 

 

static int playbackCallback( const void *inputBuffer,

                            void *outputBuffer,

                      [...]

mysql/tritonnのinsertベンチマーク

tritonn使おうかな。
これがいい
Tritonnを使うとMySQLはどう変わるの?
従いまして、MySQLにこのパッチを適用した場合、変わるのは基本的にはMyISAMのFULLTEXTインデックスの振る舞いのみで、後はこれまでと同様となっています。またこの図をご覧頂くとお分かりになるかと思いますが、MySQLへアクセスするアプリケーションから見ると、MySQLの上位層がSennaを隠蔽しているため、アプリケーション側で特にSennaを意識する必要はありません。
MATCH/AGAINSTを使ったSELECTでちょっぱやになる代わりに、
気になるのは、
INSERT時にどれだけ遅くなるのか?
実データに近い環境で計測してみる
test table
+--------------+---------------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra [...]

Firebugのconsole.logが動かないなぁ

as3から
ExternalInterface.call('console.log', obj);
って呼んでるのがたまにスルーされるなーと困ってた@Firebug1.2
http://getfirebug.com/releases/
http://getfirebug.com/releases/firebug/1.3/firebug-1.3.0a4.xpi
1.3.0a4でok

クロスプラットフォームな音声IO portaudioを試す

週末にもりもり更新されるブログです。
クロスプラットフォームとかほんとめんどくさいけどやってみるよ。
音声のとこもマイクからの入力とか再生とかプラットフォーム依存だよなーと思ってたらportaudioがよいかも。
PortAudio - portable cross-platform Audio API
自分と同じようにlibjingle使ってみてる人がいて
Libjingle for Mac OS X
Support for OS X was written several months ago, by defining a new sound card type in mediastreamer (a third-party framework included in libjingle), making use of the cross-platform PortAudio API to do interaction with the audio hardware. We never tested it, so we assumed [...]

libjingleのNAT越えの様子

またlibjingleいじり。
callサンプルはGIPS Media Engineが手に入らないし多分ただで商用アプリに使えなさそうだし、LinphoneもVisualC++環境ではコンパイルできないので、さくっとは動かない!
pcp(ファイル転送)サンプルの動きを見る。
コマンドラインオプションで -d をつけてpcpサンプルを動かすと、UDPホールパンチングの様子がログに流れる。
libjingleはLOG4Jっぽくログレベルを設定したりできていい感じ。
少しログ出力をカスタマイズしながら眺める。
基本的には、流れはこんな感じ。
自分のマシンの全てのローカルIP+STUNサーバから取得したグローバルIPと、
相手の同じ情報、の全ての組み合わせを、優先度つけながら試していく。
ローカルIP > STUNで得られたグローバルIP ( > リレーサーバのIP )
これがICEって仕組みかな?
Interactive Connectivity Establishment (ICE): A Protocol for Network
Address Translator (NAT) Traversal for Offer/Answer Protocols

PLAIN TEXT
CODE:

[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:192.168.174.1:2584|C-w|udp]: sendstun

[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:5.rem_hamachi:2586|C-w|udp]: sendstun

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.0.2:2580|C-w|udp]: sendstun

Error(port.cc:310): [J]Port[private-1:stun:Net[0:114.emobile]]: Received STUN response with bad username2

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.88.1:2582|C-w|udp]: sendstun

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:192.168.174.1:2584|C-w|udp]: sendstun

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:5.rem_loc_hamachi:2586|C-w|udp]: sendstun

[J]Conn[0:private-1:local:114.emobile:1116->private-1:stun:61.stun_global:2581|C-w|udp]: sendstun

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:stun:61.stun_global:2581|C-w|udp]: sendstun

[J]Conn[0:private-1:stun:114.emobile:1118->private-1:local:192.168.0.2:2580|C-w|udp]: sendstun

[J]Conn[0:private-1:stun:114.emobile:1118->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw

[J]Conn[0:private-1:local:114.emobile:1116->private-1:local:61.stun_global:2580|CRw|udp]: [r]CRw

[J]Port[private-1:local:Net[0:114.emobile]]: got request, send response

[J]Conn[0:private-1:local:5.loc_hamachi:1119->private-1:local:61.stun_global:2580|CRw|udp]: [...]

gist embed お試し

最新から拾ってきただけ