封印再度 WHO INSIDE S&M

封印再度 WHO INSIDE S&M

封印再度 WHO INSIDE S&M

UNIXのメールを見てみるが、差出人とサブジェクトを眺めただけで読む気にもなれない。とりあえずは、熱いコーヒーを強制的に喉に流し込む。おそらく、この魔法の飲みものが地球上になかったら、犀川の午前中は存在しないのと同じになる。人生の半分はコーヒーから生まれた、といっても過言ではない。

しかし、そうした決心も、翌朝、目覚めてみると必ず覆ってしまうのだった。他人の存在を自分の内側から許容するという(たぶんありふれた)能力が、どうやら自分には欠落しているようだ、と最近気がついた。自信なのか、勇気なのか……、そんな、ほんのささやかな能力が、いざというときに必ず引っ込んでしまうことも、彼女自身が一番よく知っている。

詩的私的ジャック JACK THE POETICAL PRIVATE S&M

詩的私的ジャック JACK THE POETICAL PRIVATE S&M

詩的私的ジャック JACK THE POETICAL PRIVATE S&M

「どんなところが面白いですか? 研究って」
萌絵はきいた。
「そうだね……。それも、よくきかれるけどね」
結城寛が微笑む。
「うまく言葉で説明できないし、自分でも理屈はよくわからない。でも、これよりも面白いものが、人類に残されているかって思うよ」
「大学院に進学しようかどうか迷っているんです」
萌絵は相談してみることにした。
犀川先生にご相談すれば良いわ」
杉東が横から言う。
「将来のこととかも含めて」
「ええ、先生は進学した方が良いって……」
「なんだ、それじゃあ、迷うことはないでしょう?」と杉東。

「将来を決めてしまうなんて、恐ろしいじゃないか。そんな恐いことはしたくない」犀川が言う。「台風の進路だって、扇形に広がっているだろう? 人間の進路はもっと広角だ」

あたりまえのぜひたく。

あたりまえのぜひたく。

あたりまえのぜひたく。

bookbar で紹介されていて購入。内容すごい良かった。料理する人は好きそう。 大根とこんにゃくの件が個人的に良かった。

native webrtc (objc) で audio track に echo cancel, auto gain control などのオプションを設定する

音声を送る場合は

let audioTrack = factory.audioTrackWithID("...")

のような感じで作るがオプション (RTCMediaConstraints) を現状 RTCPeerConnectionFactory からだと渡せないのでやはり自前で書く必要がある

- (RTCAudioTrack*)audioTrackWithID:(NSString*)audioId constraints:(RTCMediaConstraints*)constraints {
    
    rtc::scoped_refptr<webrtc::AudioSourceInterface> source = self.nativeFactory->CreateAudioSource(constraints.constraints);
    rtc::scoped_refptr<webrtc::AudioTrackInterface> track =
    self.nativeFactory->CreateAudioTrack([audioId UTF8String], source);
    return [[RTCAudioTrack alloc] initWithMediaTrack:track];
}

このようなメソッドを用意し

        let audioConstraints = RTCMediaConstraints(mandatoryConstraints: [
            RTCPair(key: "googAutoGainControl", value: "false"),
            RTCPair(key: "googAutoGainControl2", value: "false"),
            RTCPair(key: "googEchoCancellation", value: "false"),
            RTCPair(key: "googEchoCancellation2", value: "false"),
            RTCPair(key: "googNoiseSuppression", value: "false"),
            RTCPair(key: "googNoiseSuppression2", value: "false"),
            RTCPair(key: "googHighpassFilter", value: "false"),
            ], optionalConstraints: [])
        
        let audioTrack = factory.audioTrackWithID("...", constraints: audioConstraints)

上のように audio track を作ると echo cancel, auto gain control などを無効・有効に出来る。 人間の会話を送る場合は特にこれらを無効にする必用はないが、音楽などを送る場合は適してないので無効にすると良い。

ここで指定出来るオプションはここに書いてある。

video のほうは track と source が分かれて method がちゃんと生えてるのでこのようなことをする必用はない。

native webrtc (mac) で audio の input device を変更する

既に存在する PeerConnectionFactory から変更する方法が変わらなかったので、とりあえず初期化の時に変更する方法

        webrtc::AudioDeviceModule *adm = webrtc::CreateAudioDeviceModule(0, webrtc::AudioDeviceModule::kPlatformDefaultAudio);
        int ret = adm->Init();
        NSAssert(ret == 0, @"failed init audio device modules");
        
        for (int i = 0; i < adm->RecordingDevices(); i++) {
            char name[webrtc::kAdmMaxDeviceNameSize];
            char guid[webrtc::kAdmMaxGuidSize];
            int ret = adm->RecordingDeviceName(i, name, guid);
            NSAssert(ret == 0, @"failed RecordingDeviceName");
            NSLog(@"%d %s %s", i, name, guid);
        }
        
        adm->SetRecordingDevice(...);

として AudioDeviceModule を初期化しこれを webrtc::CreatePeerConnectionFactory に渡す必用がある。

RTCPeerConnectionFactory.mm のような wrapper を自分で書いちゃうのが早そう。