AVCaptureSession でマイク入力を得る / AudioBufferList.allocate() 後のメモリリーク

https://github.com/daisuke-t-jp/AVCaptureAudioDataOutputSampleBufferTesting

iOS でマイク入力を取得してみたかったので試してみた。↑が、そのサンプルプロジェクト。

今回、いろいろなプロジェクトを参考にしてやってみたのだが、気になる点がひとつ。

AVCaptureAudioDataOutputSampleBufferDelegatecaptureOutput() を下のような感じで実装するパターンが多いのだが

extension ViewController: AVCaptureAudioDataOutputSampleBufferDelegate {
  func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {
    
    var blockBuffer: CMBlockBuffer?
    let audioBufferList = AudioBufferList.allocate(maximumBuffers: 1)

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
      sampleBuffer,
      bufferListSizeNeededOut: nil,
      bufferListOut: audioBufferList.unsafeMutablePointer,
      bufferListSize: MemoryLayout<AudioBufferList>.size,
      blockBufferAllocator: nil,
      blockBufferMemoryAllocator: nil,
      flags: UInt32(kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment),
      blockBufferOut: &blockBuffer
    )
  }
}


AudioBufferList.allocate()

https://github.com/apple/swift/blob/6e7051eb1e38e743a514555d09256d12d3fec750/stdlib/public/Darwin/CoreAudio/CoreAudio.swift#L67

f:id:daisuke-t-jp:20191015080703p:plain:w500

ということで free() を要することがコメントされている。
これを Xcode の Instruments で実際に試してみると


f:id:daisuke-t-jp:20191015081216p:plain:w500

やはりこんな感じでメモリリークを確認できた。

なので先ほどの AudioBufferList.allocate の周りのコードはこんな感じに修正するとメモリリークが消える。(defer はこんな風なリソース解放の時に便利だ)

let audioBufferList = AudioBufferList.allocate(maximumBuffers: 1)
    defer {
      free(audioBufferList.unsafeMutablePointer)
    }




・・・というリークが AVCaptureSession のコードで参考にした https://github.com/google/science-journal-ios のプロジェクトでも起きていたので、この修正をプルリクエストしてみたら、レビューが通ってマージされたので、なんか一件落着という感じで落ち着きましたよ。

『孤独論 逃げよ、生きよ』(田中慎弥)を読んだ

孤独論 逃げよ、生きよ

孤独論 逃げよ、生きよ

田中さんの本を読んだことはなかったけど、ラジオ番組(http://www.joqr.co.jp/golden/2016/08/post-508.html)に出ているのをたまたま聴いて興味を持ったので読んでみた。

"孤独"というものが、人生を深くすることが書かれている。

本の第一印象は、装丁が黒色で、タイトルが"孤独"なので、暗く突き離した印象がしたけど、そんなことはなく読みやすい。

田中さんは高校卒業後、就職することなく30歳を超えて新人賞を受賞してデビュー。毎日毎日、家族以外とコミュニケーションを取ることなく、書くことを自分に課して、それを続けられたので孤独に対して人一倍耐性があるのではないかと思った。

しかし、孤独が自分の時間を濃くし、自分を保ち、深くするというエッセンス自体は、多くの人に共通するだろう。

SwiftUI 位置情報をトラッキングする

LocationManager でトラッキングした位置情報を、地図上に表示する SwiftUI のサンプルを作成した。上のリンクから完全なプロジェクトを持ってこれる。


動作させると、こんな感じ。


シミュレータの設定で Freeway Drive にしておくと自動で位置が更新され、確認しやすい。


位置情報の取得自体は SwiftUI 以前とあまり変わらないが @ObservedObject @Published など、データの配信・伝搬の概念がキモと感じた。

FFmpeg 動画から gif へ変換(フレームレートとサイズを指定)

よく忘れるのでメモ。

フレームレートを 10 にして、サイズを横幅 640 にして gif へ変換する場合はこれ。

ffmpeg -i in.mov -r 10 -vf scale=640:-1 output.gif

『オウム事件 17年目の告白』(上祐 史浩)を読んだ

オウム事件 17年目の告白

オウム事件 17年目の告白

感想

著者が上祐史浩さん。「検証」が有田芳生さん(参議院議員)になっている。

本の構成としては、当時のオウムの内政、麻原彰晃について、どうしてこのような事態になったのか、など上祐さんが述懐する当時のオウムが8割くらいあり、最後に有田芳生さんとの対談という形で終わる。

読んでいて思ったこと。。
罪をおかした人が罰を受ける事とは別に、そういった個人がどうして出てきたのか、という反省を社会がする必要があると思った。環境(家庭、経済)によって人は変わるし、その反省を次世代に安全装置(法律、学習指導要領、倫理)として残していくと、多少よくなるところもあるのかなぁと。

Google Swift Style Guide

https://google.github.io/swift/

Google は Swift のコーディングガイドラインを公開している。Lint のルールが決まっていない、指標になる標準的なルールを探している場合、このガイドを参考にすると良いと思う。

以下、いくつかルールを紹介する。

空白文字

https://google.github.io/swift/#whitespace-characters

空白文字には半角スペース(U+0020)を使用する。
タブ文字はインデントに使用しない。

列の制限

https://google.github.io/swift/#column-limit

一行のコードは100文字が制限。ただし、例外もある。

例外)

  • 1行である必要があるテキスト(例:コメント内の長い URL)
  • インポート文
  • 別のツールによって生成されたコード

セミコロン

https://google.github.io/swift/#semicolons

ステートメントの終了にセミコロンを使用しない。つまり、セミコロンを使用するのは、文字列リテラルかコメント内だけになる。

プロパティ

https://google.github.io/swift/#properties

タプルをのぞき、 let, var で宣言できる変数は1つのみとする

// これは NG
var a = 5, b = 10
// これは OK
var a = 5
var b = 10

let (quotient, remainder) = divide(100, 9)

グローバル定数

ほかの変数の同じようにローワーキャメルケースで命名する。また、g や k で始まるハンガリアン記法は使用しない。

// これは OK
let secondsPerMinute = 60
// これは NG
let SecondsPerMinute = 60
let kSecondsPerMinute = 60
let gSecondsPerMinute = 60
let SECONDS_PER_MINUTE = 60

xxHash v0.7.2 リリース

https://github.com/Cyan4973/xxHash/releases/tag/v0.7.2

これは 2019/10/8(JST)にリリースされた xxHash v0.7.2 についてのメモである。

リリースノート(意訳)

xxHash v0.7.2 は新しい 128bit ハッシュのためのメンテナンスリリースである。

XXH3 にはまだ Experimental(実験的)というラベルがついていることに注意してください。
また、このバージョンとこれまでのバージョンの戻り値は、互換性がないことに注意。

以下、詳細。

  • 特定の長さの入力に対する衝突率を修正
  • VSXMEON の改良
  • XXH_VECTOR=0 の場合のコードパスの改良
  • xxhsumコマンドライン・ユーティリティ)
    • -H2 で 128bit ハッシュを生成できます(しかし、128bit ハッシュはまだ開発途中のため、実験目的であることに注意!)
    • -q オプションでステータスの通知を削除できます