• 1011月

    先日、やっとLeopard対応をした拙作のフリーソフト「MuteCon
    ですが、今までずっとQuickTime関連のAPIを使って音の制御を
    していました。

    別にそれ自体は古くてOS互換がない、とかいうことはないのですが、
    MuteCon自体、iMacなどで現状、ひとつ問題を抱えてるんですよね。

    それは内蔵音源を使っていて、ヘッドホン端子にスピーカーが
    つないであるケースです。

    そうすると、最近のMac OS Xのバージョンでは起動時のところまで
    何故か内蔵スピーカーから音が出て、OSの起動が終わってから
    ヘッドホン端子に切り替わる、という変な(?)ことをやってくれてます。

    内蔵スピーカーとヘッドホンでは独立して音量やミュートの設定が
    できるようになっていて、その影響でヘッドホン端子に何か挿して
    あると、内蔵スピーカーのミュートをMuteCon側から制御できないんです。

    これはOS上でも同じで、端子を抜くと、内蔵スピーカーの設定が
    できるようになります。

    そこで、もしかしたらCore AudioのFrameWorkを使えば、それも
    制御できるのでは?と、色々と試行錯誤しています。

    とりあえず、現状までの機能をCoreAudioに移植するところまでは
    できたのですが、やはり内蔵スピーカーはデバイスとしては
    見えません。

    まぁ本来、同じ「内蔵音源」であるわけですから、デバイスは同じ
    ですよねぇ。
    チャンネルが違うのか?と思ったら、それも違うようで、違うのは
    ソースのようです。

    ただ、ソースは違うものの、やはりヘッドホンを挿している時は
    「Audio MIDI設定」でも内蔵スピーカーの設定はできません。(^^;

    うーん、これ、一体どういうことをやってるんでしょうねぇ。
    どなたか、Core Audioに詳しい方がいらしたら、ぜひ教えてくださいませ。

    おそらく、AudioDeviceGetPropertyInfo()あたりでkAudioDeviceProperty
    DataSourcesとかを見て、ごちゃごちゃ、やるんだろうなぁ。(^^;

    色々と試行錯誤してみて、もしうまくいったら、MuteConをアップデート
    して、対応したいと思います。

    (当サイトでは、Amazonアソシエイトをはじめとした第三者配信のアフィリエイトプログラムにより商品をご紹介致しております。)

    Filed under: Mac
    2007/11/10 9:24 pm | 2 Comments

2 Responses

WP_Lime_Slice
  • Decomo Says:

    はじめまして。
    Core Audioは少々かじった事がある程度であまり詳しい事はわかりませんが、/Developer/Examples/CoreAudio/HAL/HALLabが参考になるのではないでしょうか。
    HLDeviceWindowOutputControlsController.mmの550行目あたりからで、実際の出力先がどこなのか(内蔵スピーカかヘッドホンか)を判断しているようです。
    既にご存知or解決済みでしたら失礼しました

  • MacBS Says:

    Decomoさん、コメントありがとうございます。

    Mac関係は資料が少ないので、貴重な情報、大変助かります。
    街頭の処理ですが、最終的にはCAAudioHardwareDevice.cppという
    ソースの中の関数がCallされているようですね。

    で、やっぱりそこではkAudioDevicePropertyDataSourcesを
    使って取得していました。
    で、見えるのはやっぱりAvailableなソースだけのようでして…。
    ヘッドホンをさしてる間は内蔵スピーカーは見えないんですよねぇ。

    ここを制御するにはやっぱりPRAMをいじらないと無理なのかも。
    とはいえ、このソースはとても参考になるので、もう少し
    研究してみたいと思います。
    ありがとうございます。