複数のプラットフォームでwavファイルを再生する

windows, mac, freeBSD, linux上で標準モジュールだけを使いwavファイルを再生するコードを書く。

FreeBSD, Linuxの場合

ossaudiodev標準モジュールを使って再生する。メモリ上のデータを渡すのでwave標準モジュールを使うなどしてあらかじめデータをメモリ上に展開しておく。

import ossaudiodev
import wave

wav = wave.open(filepath, "r")
dev = ossaudiodev.open("w")
format = [None, ossaudiodev.AFMT_U8, ossaudiodev.AFMT_S16_LE][wav.getsampwidth()]
dev.setparameters(format, wav.getnchannels(), wav.getframerate())
dev.write(wav.readframes(wav.getnframes())

MacOSXの場合

AppKitモジュールのNSSoundを使う。詳細は不明。
再生が非同期らしいのでポーリングループで同期させている。
参考:http://yamashita.dyndns.org/blog/play-sounds-with-python-on-mac/

import AppKit

sound = AppKit.NSSound.alloc()
sound.initWithContentsOfFile_byReference_(filepath, True)
sound.play()
while sound.isPlaying():
    pass

Windowsの場合

winsound標準モジュールを使う。

import winsound
winsound.PlaySound(filepath, winsound.SND_FILENAME)