In-Memory Audio Streaming (日本語)

このコードスニペットでは FileData から音声を読み込んだ後に、メモリから音声を Decoder でデコードする基本的な方法について説明します。これは SoundData 全体をメモリに読み込むのとは異なり、ファイル全体をデコードするためメモリ消費量と処理時間が増加します。

LÖVE version 0.10.2 (Super Toast) および 11.0 (Mysterious Mysteries) で動作します。また 0.9.2 (Baby Inspector) でも動作するかもしれません (要検証)。

簡易版

動作原理を解説した非常に簡易的なスニペット。

-- メモリへ音声ファイルデータを読み込みます
local audioFile = love.filesystem.newFileData("file/to/audio.ogg")
-- FileData から "stream" 方式の Source を新規作成します
local source = love.audio.newSource(audioFile, "stream")
-- "stream" 方式であることを保証します。この行は検査目的で使います
assert(source:getType() == "stream")
-- 音声を再生します
source:play()

完全版

LÖVE フレームワークにおける実際の内部動作を解説に加えたスニペットです。

-- 音声ファイルを開きます
local audioHandle = love.filesystem.newFile("file/to/audio.ogg", "r")
-- ファイルの内容を読み込みます。まだエンコード済み形式です。
local audioContents = audioHandle:read()
-- 音声の内容から FileData を新規作成します。
-- 正常なファイル拡張子が第二引数へ指定されていることを確認してください! 
-- Decoder はデータの内容ではなく、拡張子から音声形式を判定します!
local audioData = love.filesystem.newFileData(audioContents, "_.ogg"))
-- 音声のデコードに使う Decorder を新規作成します
local decoder = love.sound.newDecoder(audioData)
-- 作成された Decoder から "stream" 方式の Source を新規作成します
local source = love.audio.newSource(decoder, "stream")
--  "stream" 方式であることを保証します。この行は検査目的で使います
assert(source:getType() == "stream")
-- 音声を再生します
source:play()