U⁄A LABO

RSS

SEARCH

AUTHOR

  • Naoki Muramatsu (1件) Twitter:@Stryfy.

  • deco-dekai (1件) ビートダウンパートでご飯何杯も食べられます。
    ハードコア・テクニカルディレクターを目指して日々精進。

  • yanbou (6件) 犬と猫で、家が毎日運動会のフラッシュデベロッパー。
    ビールから発泡酒へ変更で節約中。

  • chikatherrsix (8件) メタル界のフラッシュデベロッパー。またある時はメタルギタリスト。オーサリング中もヘッドバンギングは絶やさない。

  • akuze (2件) 2003年からユナイティアに寄生しているフラッシュデベロッパー。
    シルクドソレイユとカナダが好き。

  • knockknock (16件) 小遣い2万円のフラッシュデベロッパー。
    帰りが遅いのにキレる嫁をだましだまし制作中・・・。

  • takaiw (18件) フラッシュデベロッパー。遊びでゲームを作るのも好きです。外見に似合わないイラストを描くのも好きです。とにかく作るのが好きです。

CATEGORY

HOME  >  SoundChannelがnull?

2011.08.08 takaiw

SoundChannelがnull?




久々の投稿になります。
最近はAndroidアプリを個人的に挑戦しています。
スクリーンサイズだけでなくピクセルの密度に差異が
あるのが制作者に悩ましそうですね。
PCでのFlashコンテンツ制作にはない悩みです。
久々の分、ネタはあるのですが筆不精で進まないのを
反省しています。今回はあるAIRアプリをリリースできたので
連投予定です。

さて、今回はかなり前にハマッたSoundChannelクラスの件です。
春ごろのネタなので古くて申し訳ありません。

ご存知のようにFlashではサウンドデータをSoundのサブクラスとして
定義でき、それをnewして再生することが可能です。

var sound:Sound = new HogeSound();
sound.play();

そして、そのサウンドの音量を変える際、
SoundMixerを使ってサウンドの音量を
変えることができます。
ただしSoundMixerは全体の音量を制御できますが
個別の音量は制御できません。

そこで、SoundChannelインスタンスを生成して

var sound:Sound = new HogeSound();
var soundChannel:SoundChannel = sound.play();
var sTransform:SoundTransform = new SoundTransform();
sTransform.volume = 0.5;
soundChannel.soundTransform = sTransform;

と音量を調整します。
また、EventDispatherクラスを継承していますので
addEventListenerでサウンドの終了を検知できます。

そういうことはDocを見ればお分かりになると思いますが、
今回引っかかったのはSound#playで取得するsoundChannel
インスタンスにnullの可能性があるということです。

ASDocによると
Sound#playの返却型はSoundChannelで、

サウンドの制御に使用する SoundChannel オブジェクトです。このメソッドは、サウンドカードがない場合、または使用できるサウンドチャンネルが不足した場合は null を返します。一度に使用できるサウンドチャンネルの最大数は 32 チャンネルです。

と記載されています。
たとえばサウンドデバイスを無効にしているPCはnullになります。
そういうマシンは巷にあまりないのですが、たまに古いノートPCに
非搭載のものがあります。仕事用のカスタムノートPCなら
あり得るかもしれません。
後半のチャンネル数のくだりは調査不足で把握していませんが、
デバイス有効でもnullを取得し得るという意味だとは思います。

SoundChannelインスタンスがnullになると
そのメソッドを実行しようものなら
当然ラインタイムエラーを引き起こし
プログラムはストップします。
Webで閲覧しているユーザーのほとんどは
デバッグプレイヤーではないので
フリーズしたと認識します。

...なので忘れがちなnullチェック+ハンドリングは
するべきでしょう。try~catchで囲っても良いですが。
CATEGORY