VirtualBox

Changeset 95423 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 29, 2022 11:13:40 AM (3 years ago)
Author:
vboxsync
Message:

Audio/Main: Bigger revamp of the audio interface(s) to later also support host audio device enumeration and selection for individual VMs. The audio settings now live in a dedicated (per-VM) IAudioSettings interface (audio adapter + audio host device stuff), to further tidy up the IMachine interface. Also added stubs for IAudioDevice + IHostAudioDevice, plus enmuerations, left for further implementation. Added a new IHostAudioDeviceChangedEvent that can also be used later by API clients. bugref:10050

Location:
trunk/src/VBox
Files:
4 added
27 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp

    r95140 r95423  
    435435        {
    436436            setCurrentSubcommand(HELP_SCOPE_CONTROLVM_AUDIOIN);
     437
     438            ComPtr<IAudioSettings> audioSettings;
     439            CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    437440            ComPtr<IAudioAdapter> adapter;
    438             CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioAdapter)(adapter.asOutParam()));
     441            CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(adapter.asOutParam()));
    439442            if (adapter)
    440443            {
     
    459462        {
    460463            setCurrentSubcommand(HELP_SCOPE_CONTROLVM_AUDIOOUT);
     464
     465            ComPtr<IAudioSettings> audioSettings;
     466            CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    461467            ComPtr<IAudioAdapter> adapter;
    462             CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioAdapter)(adapter.asOutParam()));
     468            CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(adapter.asOutParam()));
    463469            if (adapter)
    464470            {
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r95364 r95423  
    21442144    }
    21452145
    2146     ComPtr<IAudioAdapter> AudioAdapter;
    2147     hrc = machine->COMGETTER(AudioAdapter)(AudioAdapter.asOutParam());
     2146    ComPtr<IAudioSettings> audioSettings;
     2147    ComPtr<IAudioAdapter>  audioAdapter;
     2148    hrc = machine->COMGETTER(AudioSettings)(audioSettings.asOutParam());
     2149    if (SUCCEEDED(hrc))
     2150        hrc = audioSettings->COMGETTER(Adapter)(audioAdapter.asOutParam());
    21482151    if (SUCCEEDED(hrc))
    21492152    {
     
    21522155        const char *pszCodec = Info::tr("Unknown");
    21532156        BOOL fEnabled;
    2154         hrc = AudioAdapter->COMGETTER(Enabled)(&fEnabled);
     2157        hrc = audioAdapter->COMGETTER(Enabled)(&fEnabled);
    21552158        if (SUCCEEDED(hrc) && fEnabled)
    21562159        {
    21572160            AudioDriverType_T enmDrvType;
    2158             hrc = AudioAdapter->COMGETTER(AudioDriver)(&enmDrvType);
     2161            hrc = audioAdapter->COMGETTER(AudioDriver)(&enmDrvType);
    21592162            switch (enmDrvType)
    21602163            {
     
    22252228            }
    22262229            AudioControllerType_T enmCtrlType;
    2227             hrc = AudioAdapter->COMGETTER(AudioController)(&enmCtrlType);
     2230            hrc = audioAdapter->COMGETTER(AudioController)(&enmCtrlType);
    22282231            switch (enmCtrlType)
    22292232            {
     
    22502253            }
    22512254            AudioCodecType_T enmCodecType;
    2252             hrc = AudioAdapter->COMGETTER(AudioCodec)(&enmCodecType);
     2255            hrc = audioAdapter->COMGETTER(AudioCodec)(&enmCodecType);
    22532256            switch (enmCodecType)
    22542257            {
     
    22812284            RTPrintf("\n");
    22822285        }
    2283         SHOW_BOOLEAN_PROP(AudioAdapter, EnabledOut,  "audio_out",  Info::tr("Audio playback:"));
    2284         SHOW_BOOLEAN_PROP(AudioAdapter, EnabledIn, "audio_in", Info::tr("Audio capture:"));
     2286        SHOW_BOOLEAN_PROP(audioAdapter, EnabledOut,  "audio_out",  Info::tr("Audio playback:"));
     2287        SHOW_BOOLEAN_PROP(audioAdapter, EnabledIn, "audio_in", Info::tr("Audio capture:"));
     2288
     2289        /** @todo Add printing run-time host audio device selection(s) here. */
    22852290    }
    22862291
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r95368 r95423  
    25312531            case MODIFYVM_AUDIOCONTROLLER:
    25322532            {
     2533                ComPtr<IAudioSettings> audioSettings;
     2534                CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    25332535                ComPtr<IAudioAdapter> audioAdapter;
    2534                 sessionMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     2536                CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(audioAdapter.asOutParam()));
    25352537                ASSERT(audioAdapter);
    25362538
     
    25512553            case MODIFYVM_AUDIOCODEC:
    25522554            {
     2555                ComPtr<IAudioSettings> audioSettings;
     2556                CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    25532557                ComPtr<IAudioAdapter> audioAdapter;
    2554                 sessionMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     2558                CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(audioAdapter.asOutParam()));
    25552559                ASSERT(audioAdapter);
    25562560
     
    25732577            case MODIFYVM_AUDIO:
    25742578            {
     2579                ComPtr<IAudioSettings> audioSettings;
     2580                CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    25752581                ComPtr<IAudioAdapter> audioAdapter;
    2576                 sessionMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     2582                CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(audioAdapter.asOutParam()));
    25772583                ASSERT(audioAdapter);
    25782584/** @todo r=klaus: don't unconditionally bolt together setting the audio driver
     
    26542660            case MODIFYVM_AUDIOIN:
    26552661            {
     2662                ComPtr<IAudioSettings> audioSettings;
     2663                CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    26562664                ComPtr<IAudioAdapter> audioAdapter;
    2657                 sessionMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     2665                CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(audioAdapter.asOutParam()));
    26582666                ASSERT(audioAdapter);
    26592667
     
    26642672            case MODIFYVM_AUDIOOUT:
    26652673            {
     2674                ComPtr<IAudioSettings> audioSettings;
     2675                CHECK_ERROR_BREAK(sessionMachine, COMGETTER(AudioSettings)(audioSettings.asOutParam()));
    26662676                ComPtr<IAudioAdapter> audioAdapter;
    2667                 sessionMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     2677                CHECK_ERROR_BREAK(audioSettings, COMGETTER(Adapter)(audioAdapter.asOutParam()));
    26682678                ASSERT(audioAdapter);
    26692679
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp

    r95233 r95423  
    3232#include "COMEnums.h"
    3333#include "CAudioAdapter.h"
     34#include "CAudioSettings.h"
    3435#include "CBooleanFormValue.h"
    3536#include "CChoiceFormValue.h"
     
    581582    }
    582583
    583     const CAudioAdapter comAudio = comMachine.GetAudioAdapter();
    584     if (comAudio.GetEnabled())
     584    const CAudioSettings comAudioSettings = comMachine.GetAudioSettings();
     585    const CAudioAdapter  comAdapter       = comAudioSettings.GetAdapter();
     586    if (comAdapter.GetEnabled())
    585587    {
    586588        /* Host driver: */
     
    588590        {
    589591            const QString strAnchorType = QString("audio_host_driver_type");
    590             const KAudioDriverType enmType = comAudio.GetAudioDriver();
     592            const KAudioDriverType enmType = comAdapter.GetAudioDriver();
    591593            table << UITextTableLine(QApplication::translate("UIDetails", "Host Driver", "details (audio)"),
    592594                                     QString("<a href=#%1,%2>%3</a>")
     
    600602        {
    601603            const QString strAnchorType = QString("audio_controller_type");
    602             const KAudioControllerType enmType = comAudio.GetAudioController();
     604            const KAudioControllerType enmType = comAdapter.GetAudioController();
    603605            table << UITextTableLine(QApplication::translate("UIDetails", "Controller", "details (audio)"),
    604606                                     QString("<a href=#%1,%2>%3</a>")
     
    613615        {
    614616            table << UITextTableLine(QApplication::translate("UIDetails", "Audio Input", "details (audio)"),
    615                                      comAudio.GetEnabledIn() ?
     617                                     comAdapter.GetEnabledIn() ?
    616618                                     QApplication::translate("UIDetails", "Enabled", "details (audio/input)") :
    617619                                     QApplication::translate("UIDetails", "Disabled", "details (audio/input)"));
    618620            table << UITextTableLine(QApplication::translate("UIDetails", "Audio Output", "details (audio)"),
    619                                      comAudio.GetEnabledOut() ?
     621                                     comAdapter.GetEnabledOut() ?
    620622                                     QApplication::translate("UIDetails", "Enabled", "details (audio/output)") :
    621623                                     QApplication::translate("UIDetails", "Disabled", "details (audio/output)"));
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMachineAttributeSetter.cpp

    r93115 r95423  
    2828/* COM includes: */
    2929#include "CAudioAdapter.h"
     30#include "CAudioSettings.h"
    3031#include "CGraphicsAdapter.h"
    3132#include "CNetworkAdapter.h"
     
    177178            {
    178179                /* Acquire audio adapter: */
    179                 CAudioAdapter comAdapter = comMachine.GetAudioAdapter();
    180                 if (!comMachine.isOk())
     180                CAudioSettings const comAudioSettings = comMachine.GetAudioSettings();
     181                CAudioAdapter        comAdapter       = comAudioSettings.GetAdapter();
     182                if (!comAudioSettings.isOk())
    181183                {
    182184                    UINotificationMessage::cannotAcquireMachineParameter(comMachine);
     
    196198            {
    197199                /* Acquire audio adapter: */
    198                 CAudioAdapter comAdapter = comMachine.GetAudioAdapter();
    199                 if (!comMachine.isOk())
     200                CAudioSettings const comAudioSettings = comMachine.GetAudioSettings();
     201                CAudioAdapter        comAdapter       = comAudioSettings.GetAdapter();
     202                if (!comAudioSettings.isOk())
    200203                {
    201204                    UINotificationMessage::cannotAcquireMachineParameter(comMachine);
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp

    r93990 r95423  
    3939/* COM includes: */
    4040#include "CAudioAdapter.h"
     41#include "CAudioSettings.h"
    4142#include "CGraphicsAdapter.h"
    4243#include "CRecordingSettings.h"
     
    419420
    420421        /* Get audio adapter: */
    421         const CAudioAdapter comAdapter = comMachine.GetAudioAdapter();
     422        const CAudioSettings comAudioSettings = comMachine.GetAudioSettings();
     423        const CAudioAdapter  comAdapter       = comAudioSettings.GetAdapter();
    422424        const bool fAudioEnabled = comAdapter.GetEnabled();
    423425        if (fAudioEnabled)
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp

    r95368 r95423  
    7676/* COM includes: */
    7777#include "CAudioAdapter.h"
     78#include "CAudioSettings.h"
    7879#include "CDisplay.h"
    7980#include "CEmulatedUSB.h"
     
    21822183
    21832184    /* Access audio adapter: */
    2184     CAudioAdapter comAdapter = machine().GetAudioAdapter();
     2185    CAudioSettings const comAudioSettings = machine().GetAudioSettings();
     2186    CAudioAdapter        comAdapter       = comAudioSettings.GetAdapter();
    21852187    AssertMsgReturnVoid(machine().isOk() && comAdapter.isNotNull(),
    21862188                        ("Audio adapter should NOT be null!\n"));
     
    22182220
    22192221    /* Access audio adapter: */
    2220     CAudioAdapter comAdapter = machine().GetAudioAdapter();
     2222    CAudioSettings const comAudioSettings = machine().GetAudioSettings();
     2223    CAudioAdapter        comAdapter       = comAudioSettings.GetAdapter();
    22212224    AssertMsgReturnVoid(machine().isOk() && comAdapter.isNotNull(),
    22222225                        ("Audio adapter should NOT be null!\n"));
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp

    r95368 r95423  
    5858/* COM includes: */
    5959#include "CAudioAdapter.h"
     60#include "CAudioSettings.h"
    6061#include "CGraphicsAdapter.h"
    6162#include "CHostUSBDevice.h"
     
    672673{
    673674    /* Make sure Audio adapter is present: */
    674     const CAudioAdapter comAdapter = machine().GetAudioAdapter();
     675    const CAudioSettings comAudioSettings = machine().GetAudioSettings();
     676    const CAudioAdapter  comAdapter  = comAudioSettings.GetAdapter();
    675677    AssertMsgReturnVoid(machine().isOk() && comAdapter.isNotNull(),
    676678                        ("Audio adapter should NOT be null!\n"));
     
    12631265        /* Devices options: */
    12641266        {
    1265             const CAudioAdapter comAudio = m_machine.GetAudioAdapter();
     1267            const CAudioSettings comAudioSettings = m_machine.GetAudioSettings();
     1268            const CAudioAdapter  comAdapter = comAudioSettings.GetAdapter();
    12661269            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Output)->blockSignals(true);
    1267             actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Output)->setChecked(comAudio.GetEnabledOut());
     1270            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Output)->setChecked(comAdapter.GetEnabledOut());
    12681271            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Output)->blockSignals(false);
    12691272            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Input)->blockSignals(true);
    1270             actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Input)->setChecked(comAudio.GetEnabledIn());
     1273            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Input)->setChecked(comAdapter.GetEnabledIn());
    12711274            actionPool()->action(UIActionIndexRT_M_Devices_M_Audio_T_Input)->blockSignals(false);
    12721275        }
     
    21132116    {
    21142117        /* Check whether audio controller is enabled. */
    2115         const CAudioAdapter &comAdapter = machine().GetAudioAdapter();
     2118        const CAudioSettings comAudioSettings = machine().GetAudioSettings();
     2119        const CAudioAdapter  comAdapter = comAudioSettings.GetAdapter();
    21162120        if (comAdapter.isNull() || !comAdapter.GetEnabled())
    21172121            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_Audio);
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsAudio.cpp

    r94708 r95423  
    2626/* COM includes: */
    2727#include "CAudioAdapter.h"
     28#include "CAudioSettings.h"
    2829
    2930
     
    103104
    104105    /* Check whether adapter is valid: */
    105     const CAudioAdapter &comAdapter = m_machine.GetAudioAdapter();
     106    const CAudioSettings &comAudioSettings = m_machine.GetAudioSettings();
     107    const CAudioAdapter  &comAdapter       = comAudioSettings.GetAdapter();
    106108    if (!comAdapter.isNull())
    107109    {
     
    250252
    251253        /* Get audio adapter for further activities: */
    252         CAudioAdapter comAdapter = m_machine.GetAudioAdapter();
     254        const CAudioSettings comAudioSettings = m_machine.GetAudioSettings();
     255
     256        CAudioAdapter comAdapter = comAudioSettings.GetAdapter();
    253257        fSuccess = m_machine.isOk() && comAdapter.isNotNull();
    254258
  • trunk/src/VBox/Frontends/VirtualBox/src/snapshots/UISnapshotDetailsWidget.cpp

    r93996 r95423  
    4747/* COM includes: */
    4848#include "CAudioAdapter.h"
     49#include "CAudioSettings.h"
    4950#include "CRecordingSettings.h"
    5051#include "CRecordingScreenSettings.h"
     
    18161817    QStringList aReport;
    18171818    /* Acquire audio adapter: */
    1818     const CAudioAdapter &comAdapter = comMachine.GetAudioAdapter();
     1819    const CAudioSettings comAudioSettings = comMachine.GetAudioSettings();
     1820    const CAudioAdapter &comAdapter       = comAudioSettings.GetAdapter();
    18191821    if (comAdapter.GetEnabled())
    18201822    {
  • trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.cpp

    r95166 r95423  
    3434/* COM includes: */
    3535#include "CAudioAdapter.h"
     36#include "CAudioSettings.h"
    3637#include "CBIOSSettings.h"
    3738#include "CGraphicsAdapter.h"
     
    282283
    283284    /* Selecting recommended Audio Controller: */
    284     m_machine.GetAudioAdapter().SetAudioController(comGuestType.GetRecommendedAudioController());
     285    CAudioSettings const comAudioSettings = m_machine.GetAudioSettings();
     286    CAudioAdapter        comAdapter  = comAudioSettings.GetAdapter();
     287    comAdapter.SetAudioController(comGuestType.GetRecommendedAudioController());
    285288    /* And the Audio Codec: */
    286     m_machine.GetAudioAdapter().SetAudioCodec(comGuestType.GetRecommendedAudioCodec());
     289    comAdapter.SetAudioCodec(comGuestType.GetRecommendedAudioCodec());
    287290    /* Enabling audio by default: */
    288     m_machine.GetAudioAdapter().SetEnabled(true);
    289     m_machine.GetAudioAdapter().SetEnabledOut(true);
     291    comAdapter.SetEnabled(true);
     292    comAdapter.SetEnabledOut(true);
    290293
    291294    /* Enable the OHCI and EHCI controller by default for new VMs. (new in 2.2): */
  • trunk/src/VBox/Main/Makefile.kmk

    r95274 r95423  
    612612        src-server/ApplianceImplImport.cpp \
    613613        src-server/AudioAdapterImpl.cpp \
     614        src-server/AudioSettingsImpl.cpp \
    614615        src-server/BandwidthControlImpl.cpp \
    615616        src-server/BandwidthGroupImpl.cpp \
     
    634635        src-server/HostDnsService.cpp \
    635636        src-server/HostImpl.cpp \
     637        src-server/HostAudioDeviceImpl.cpp \
    636638        src-server/HostNetworkInterfaceImpl.cpp \
    637639        src-server/HostPower.cpp \
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r95386 r95423  
    65906590  <interface
    65916591    name="IMachine" extends="$unknown"
    6592     uuid="42643361-11f7-40b4-8d66-79029838b1f1"
     6592    uuid="9fbd57c7-e1b2-4baa-bbfb-ae831c06f32b"
    65936593    wsmap="managed"
    65946594    rest="managed"
     
    69606960    </attribute>
    69616961
    6962     <attribute name="audioAdapter" type="IAudioAdapter" readonly="yes">
    6963       <desc>Associated audio adapter, always present.</desc>
     6962    <attribute name="audioSettings" type="IAudioSettings" readonly="yes">
     6963      <desc>
     6964        The machine's audio settings.
     6965      </desc>
    69646966    </attribute>
    69656967
     
    1173911741  <interface
    1174011742    name="IHost" extends="$unknown"
    11741     uuid="fc0759a6-a5e2-41e1-93ca-64776335eb2d"
     11743    uuid="e54f6256-97a7-4947-8a78-10c013ddf4b8"
    1174211744    wsmap="managed"
    1174311745    rest="managed"
     
    1176211764    <attribute name="floppyDrives" type="IMedium" readonly="yes" safearray="yes">
    1176311765      <desc>List of floppy drives available on the host.</desc>
     11766    </attribute>
     11767
     11768    <attribute name="audioDevices" type="IHostAudioDevice" readonly="yes" safearray="yes">
     11769      <desc>List of audio devices currently available on the host.
     11770        <result name="E_NOTIMPL">
     11771          This attribute is not implemented yet.
     11772        </result>
     11773      </desc>
    1176411774    </attribute>
    1176511775
     
    2335323363
    2335423364  <enum
     23365    name="AudioDirection"
     23366    uuid="f27d209b-040c-4ae9-beae-85f9693ca07a"
     23367    >
     23368    <desc>
     23369      Audio direction enumeration.
     23370    </desc>
     23371
     23372    <const name="Unknown"       value="0">
     23373      <desc>Direction cannot be determined.</desc>
     23374    </const>
     23375    <const name="In"            value="1">
     23376      <desc>Input (Recording).</desc>
     23377    </const>
     23378    <const name="Out"           value="2">
     23379      <desc>Output (Playback).</desc>
     23380    </const>
     23381    <const name="Duplex"        value="3">
     23382      <desc>Duplex (Recording + Playback).</desc>
     23383    </const>
     23384  </enum>
     23385
     23386  <enum
     23387    name="AudioDeviceType"
     23388    uuid="95457071-ef88-45a9-8416-fc05b08731d2"
     23389    >
     23390    <desc>
     23391      Audio device type enumeration.
     23392    </desc>
     23393
     23394    <const name="Unknown"       value="0">
     23395      <desc>Device type is unknown / cannot be determined</desc>
     23396    </const>
     23397    <const name="BuiltLin"      value="1">
     23398      <desc>Built-in device (cannot be removed).</desc>
     23399    </const>
     23400    <const name="ExternalUSB"   value="2">
     23401      <desc>External device, connected via USB.</desc>
     23402    </const>
     23403    <const name="ExternalOther" value="3">
     23404      <desc>External device, connected via some other method.</desc>
     23405    </const>
     23406  </enum>
     23407
     23408  <enum
     23409    name="AudioDeviceState"
     23410    uuid="45c1b969-556a-4277-8570-b438d2ef5ebe"
     23411    >
     23412    <desc>
     23413      Audio device state enumeration.
     23414    </desc>
     23415
     23416    <const name="Unknown"    value="0">
     23417      <desc>Device state is unknown / cannot be determined</desc>
     23418    </const>
     23419    <const name="Active"     value="1">
     23420      <desc>Device is active and can be used.</desc>
     23421    </const>
     23422    <const name="Disabled"   value="2">
     23423      <desc>Device is in a disabled state.</desc>
     23424    </const>
     23425    <const name="NotPresent" value="3">
     23426      <desc>Device is marked as not being present.</desc>
     23427    </const>
     23428    <const name="Unplugged" value="4">
     23429      <desc>Device has been unplugged.</desc>
     23430    </const>
     23431  </enum>
     23432
     23433  <interface
     23434    name="IAudioDevice" extends="$unknown"
     23435    uuid="e50cd98b-ec3f-4146-9943-863dd1233691"
     23436    wsmap="managed"
     23437    rest="managed"
     23438    reservedMethods="4" reservedAttributes="8"
     23439    >
     23440    <desc>
     23441      The IAudioDevice interface represents an abstract base interface for
     23442      an audio device.
     23443    </desc>
     23444
     23445    <attribute name="id" type="uuid" mod="string" readonly="yes">
     23446      <desc>
     23447        Unique device ID.
     23448      </desc>
     23449    </attribute>
     23450
     23451    <attribute name="name" type="wstring">
     23452      <desc>
     23453        Friendly name of the device.
     23454      </desc>
     23455    </attribute>
     23456    <attribute name="type" type="AudioDeviceType">
     23457      <desc>
     23458        Device type.
     23459      </desc>
     23460    </attribute>
     23461    <attribute name="usage" type="AudioDirection">
     23462      <desc>
     23463        Usage type of the device.
     23464      </desc>
     23465    </attribute>
     23466    <attribute name="defaultIn" type="boolean">
     23467      <desc>
     23468        Whether this device is being marked as the default input
     23469        device by the host OS.
     23470      </desc>
     23471    </attribute>
     23472    <attribute name="defaultOut" type="boolean">
     23473      <desc>
     23474        Whether this device is being marked as the default output
     23475        device by the host OS.
     23476      </desc>
     23477    </attribute>
     23478    <attribute name="isHotPlug" type="boolean">
     23479      <desc>
     23480        Whether this device is being marked as a hotplug device, i.e. can
     23481        be removed from the system.
     23482      </desc>
     23483    </attribute>
     23484    <attribute name="state" type="AudioDeviceState">
     23485      <desc>
     23486        Current device state.
     23487      </desc>
     23488    </attribute>
     23489    <method name="getProperty" const="yes">
     23490      <desc>
     23491        Returns an audio specific property string.
     23492
     23493        If the requested data @a key does not exist, this function will
     23494        succeed and return an empty string in the @a value argument.
     23495
     23496      </desc>
     23497      <param name="key" type="wstring" dir="in">
     23498        <desc>Name of the key to get.</desc>
     23499      </param>
     23500      <param name="value" type="wstring" dir="return">
     23501        <desc>Value of the requested key.</desc>
     23502      </param>
     23503    </method>
     23504
     23505  </interface>
     23506
     23507  <interface
     23508    name="IHostAudioDevice" extends="IAudioDevice"
     23509    uuid="dc6dda3e-6b04-4203-b4c6-43906dc1695c"
     23510    wsmap="managed">
     23511    <desc>
     23512      Audio device provided by the host OS.
     23513    </desc>
     23514    <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
     23515  </interface>
     23516
     23517  <interface
     23518    name="IAudioSettings" extends="$unknown"
     23519    uuid="52f40b16-520e-473f-9428-3e69b0d915c3"
     23520    wsmap="managed"
     23521    rest="managed"
     23522    reservedMethods="4" reservedAttributes="8"
     23523    >
     23524    <desc>
     23525      The IAudioSettings interface represents the audio settings for a virtual machine.
     23526    </desc>
     23527
     23528    <method name="getHostAudioDevice">
     23529      <desc>
     23530        Returns the machine's current host audio device for the specified usage.
     23531        <result name="E_NOTIMPL">
     23532          This method is not implemented yet.
     23533        </result>
     23534      </desc>
     23535      <param name="usage" type="AudioDirection" dir="in">
     23536        <desc>Usage to retrieve audio device for.</desc>
     23537      </param>
     23538      <param name="device" type="IHostAudioDevice" dir="return">
     23539        <desc>Host audio device for the specified direction.</desc>
     23540      </param>
     23541    </method>
     23542
     23543    <method name="setHostAudioDevice">
     23544      <desc>
     23545        Sets the machine's current host audio device for the specified usage.
     23546        <result name="E_NOTIMPL">
     23547          This method is not implemented yet.
     23548        </result>
     23549      </desc>
     23550      <param name="device" type="IHostAudioDevice" dir="in">
     23551        <desc>Sets the host audio device for the specified usage.</desc>
     23552      </param>
     23553      <param name="usage" type="AudioDirection" dir="in">
     23554        <desc>Usage to set audio device for.</desc>
     23555      </param>
     23556    </method>
     23557
     23558    <attribute name="adapter" type="IAudioAdapter" readonly="yes">
     23559      <desc>Associated audio adapter, always present.</desc>
     23560    </attribute>
     23561
     23562  </interface>
     23563
     23564  <enum
    2335523565    name="AuthType"
    2335623566    uuid="7eef6ef6-98c2-4dc2-ab35-10d2b292028d"
     
    2361723827  <interface
    2361823828    name="IInternalSessionControl" extends="$unknown"
    23619     uuid="f4638054-f1f8-4590-941a-cdb66075c5bf"
     23829    uuid="a797fb40-7e04-4aa5-88c5-299aa0454577"
    2362023830    internal="yes"
    2362123831    wsmap="suppress"
     
    2376323973      </desc>
    2376423974      <param name="audioAdapter" type="IAudioAdapter" dir="in"/>
     23975    </method>
     23976
     23977    <method name="onHostAudioDeviceChange">
     23978      <desc>
     23979        Triggerd when the state of a host audio device
     23980        has changed.
     23981      </desc>
     23982      <param name="device" type="IHostAudioDevice" dir="in" readonly="yes">
     23983        <desc>Device the state has been changed for.</desc>
     23984      </param>
     23985      <param name="isNew" type="boolean" dir="in" readonly="yes">
     23986        <desc>Whether this is a newly detected device or not.</desc>
     23987      </param>
     23988      <param name="state" type="AudioDeviceState" dir="in" readonly="yes">
     23989        <desc>The new device state.</desc>
     23990      </param>
     23991      <param name="errorInfo" type="IVirtualBoxErrorInfo" dir="in" readonly="yes">
     23992        <desc>Error information.</desc>
     23993      </param>
    2376523994    </method>
    2376623995
     
    2581326042  <enum
    2581426043    name="VBoxEventType"
    25815     uuid="08cc6ebb-1e55-4b78-8fb1-1e06f5b4dbe9"
     26044    uuid="d9a89164-5143-49ce-b9ab-4e76edf5b93b"
    2581626045    >
    2581726046
     
    2629726526      </desc>
    2629826527    </const>
     26528    <const name="OnHostAudioDeviceChanged" value="116">
     26529      <desc>
     26530        See <link to="IHostAudioDeviceChangedEvent">IHostAudioDeviceChangedEvent</link>.
     26531      </desc>
     26532    </const>
    2629926533    <!-- End event marker -->
    2630026534    <!-- @todo rename to 'End' as it is exclusive (we use 'last' to be inclusive). -->
    26301     <const name="Last" value="116">
     26535    <const name="Last" value="117">
    2630226536      <desc>
    2630326537        Must be last event, used for iterations and structures relying on numerical event values.
     
    2811128345      </desc>
    2811228346    </attribute>
     28347  </interface>
     28348
     28349  <interface
     28350    name="IHostAudioDeviceChangedEvent" extends="IEvent"
     28351    waitable="yes"
     28352    uuid="8dcc633f-7b03-4f0a-9f40-7a784dd0835a"
     28353    wsmap="managed" autogen="VBoxEvent" id="OnHostAudioDeviceChangedEvent"
     28354    >
     28355    <desc>
     28356      Notification when a host audio device state has changed.
     28357    </desc>
     28358
     28359    <attribute name="device" type="IHostAudioDevice" readonly="yes">
     28360      <desc>
     28361        Host audio device that has changed.
     28362      </desc>
     28363    </attribute>
     28364
     28365    <attribute name="new" type="boolean" readonly="yes">
     28366      <desc>
     28367        @c true if the host device is a newly detected device, @c false if not.
     28368      </desc>
     28369    </attribute>
     28370
     28371    <attribute name="state" type="AudioDeviceState" readonly="yes">
     28372      <desc>
     28373        New audio device state.
     28374      </desc>
     28375    </attribute>
     28376
     28377    <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
     28378      <desc>
     28379        @c null on success or an error message object on failure.
     28380      </desc>
     28381    </attribute>
     28382
    2811328383  </interface>
    2811428384
  • trunk/src/VBox/Main/include/AudioAdapterImpl.h

    r93115 r95423  
    2424#endif
    2525
     26class AudioSettings;
     27
    2628#include "AudioAdapterWrap.h"
    2729namespace settings
     
    4143
    4244    // public initializer/uninitializer for internal purposes only
    43     HRESULT init(Machine *aParent);
    44     HRESULT init(Machine *aParent, AudioAdapter *aThat);
    45     HRESULT initCopy(Machine *aParent, AudioAdapter *aThat);
     45    HRESULT init(AudioSettings *aParent);
     46    HRESULT init(AudioSettings *aParent, AudioAdapter *aThat);
     47    HRESULT initCopy(AudioSettings *aParent, AudioAdapter *aThat);
    4648    void uninit();
    47 
    4849
    4950    // public methods only for internal purposes
     
    7475    HRESULT setProperty(const com::Utf8Str &aKey, const com::Utf8Str &aValue);
    7576
    76     Machine * const     mParent;
    77     const ComObjPtr<AudioAdapter> mPeer;
     77    AudioSettings * const              mParent;
     78    const ComObjPtr<AudioAdapter>      mPeer;
    7879    Backupable<settings::AudioAdapter> mData;
    7980};
  • trunk/src/VBox/Main/include/ConsoleImpl.h

    r95368 r95423  
    197197    HRESULT i_onNetworkAdapterChange(INetworkAdapter *aNetworkAdapter, BOOL changeAdapter);
    198198    HRESULT i_onAudioAdapterChange(IAudioAdapter *aAudioAdapter);
     199    HRESULT i_onHostAudioDeviceChange(IHostAudioDevice *aDevice, BOOL aNew, AudioDeviceState_T aState,
     200                                      IVirtualBoxErrorInfo *aErrInfo);
    199201    HRESULT i_onSerialPortChange(ISerialPort *aSerialPort);
    200202    HRESULT i_onParallelPortChange(IParallelPort *aParallelPort);
  • trunk/src/VBox/Main/include/HostImpl.h

    r94643 r95423  
    101101    HRESULT getDVDDrives(std::vector<ComPtr<IMedium> > &aDVDDrives);
    102102    HRESULT getFloppyDrives(std::vector<ComPtr<IMedium> > &aFloppyDrives);
     103    HRESULT getAudioDevices(std::vector<ComPtr<IHostAudioDevice> > &aAudioDevices);
    103104    HRESULT getUSBDevices(std::vector<ComPtr<IHostUSBDevice> > &aUSBDevices);
    104105    HRESULT getUSBDeviceFilters(std::vector<ComPtr<IHostUSBDeviceFilter> > &aUSBDeviceFilters);
  • trunk/src/VBox/Main/include/MachineImpl.h

    r94782 r95423  
    3030#include "MediumLock.h"
    3131#include "NetworkAdapterImpl.h"
    32 #include "AudioAdapterImpl.h"
     32#include "AudioSettingsImpl.h"
    3333#include "SerialPortImpl.h"
    3434#include "ParallelPortImpl.h"
     
    506506        IsModified_ParallelPorts         = 0x000020,
    507507        IsModified_VRDEServer            = 0x000040,
    508         IsModified_AudioAdapter          = 0x000080,
     508        IsModified_AudioSettings         = 0x000080,
    509509        IsModified_USB                   = 0x000100,
    510510        IsModified_BIOS                  = 0x000200,
     
    548548                                               const Utf8Str & /* guest port */, LONG /* guest port */ ) { return S_OK; }
    549549    virtual HRESULT i_onAudioAdapterChange(IAudioAdapter * /* audioAdapter */) { return S_OK; }
     550    virtual HRESULT i_onHostAudioDeviceChange(IHostAudioDevice *, BOOL /* new */, AudioDeviceState_T, IVirtualBoxErrorInfo *) { return S_OK; }
    550551    virtual HRESULT i_onSerialPortChange(ISerialPort * /* serialPort */) { return S_OK; }
    551552    virtual HRESULT i_onParallelPortChange(IParallelPort * /* parallelPort */) { return S_OK; }
     
    820821    const ComObjPtr<SerialPort>        mSerialPorts[SchemaDefs::SerialPortCount];
    821822    const ComObjPtr<ParallelPort>      mParallelPorts[SchemaDefs::ParallelPortCount];
    822     const ComObjPtr<AudioAdapter>      mAudioAdapter;
     823    const ComObjPtr<AudioSettings>     mAudioSettings;
    823824    const ComObjPtr<USBDeviceFilters>  mUSBDeviceFilters;
    824825    const ComObjPtr<BIOSSettings>      mBIOSSettings;
     
    957958    HRESULT getUSBControllers(std::vector<ComPtr<IUSBController> > &aUSBControllers);
    958959    HRESULT getUSBDeviceFilters(ComPtr<IUSBDeviceFilters> &aUSBDeviceFilters);
    959     HRESULT getAudioAdapter(ComPtr<IAudioAdapter> &aAudioAdapter);
     960    HRESULT getAudioSettings(ComPtr<IAudioSettings> &aAudioSettings);
    960961    HRESULT getStorageControllers(std::vector<ComPtr<IStorageController> > &aStorageControllers);
    961962    HRESULT getSettingsFilePath(com::Utf8Str &aSettingsFilePath);
     
    13991400    HRESULT i_onVMProcessPriorityChange(VMProcPriority_T aPriority);
    14001401    HRESULT i_onAudioAdapterChange(IAudioAdapter *audioAdapter);
     1402    HRESULT i_onHostAudioDeviceChange(IHostAudioDevice *aDevice, BOOL aNew, AudioDeviceState_T aState, IVirtualBoxErrorInfo *aErrInfo);
    14011403    HRESULT i_onSerialPortChange(ISerialPort *serialPort);
    14021404    HRESULT i_onParallelPortChange(IParallelPort *parallelPort);
  • trunk/src/VBox/Main/include/SessionImpl.h

    r93115 r95423  
    9191                                   BOOL aChangeAdapter);
    9292    HRESULT onAudioAdapterChange(const ComPtr<IAudioAdapter> &aAudioAdapter);
     93    HRESULT onHostAudioDeviceChange(const ComPtr<IHostAudioDevice> &aDevice,
     94                                    BOOL aNew, AudioDeviceState_T aState,
     95                                    const ComPtr<IVirtualBoxErrorInfo> &aErrInfo);
    9396    HRESULT onSerialPortChange(const ComPtr<ISerialPort> &aSerialPort);
    9497    HRESULT onParallelPortChange(const ComPtr<IParallelPort> &aParallelPort);
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r95368 r95423  
    52395239}
    52405240
     5241/**
     5242 * Called by IInternalSessionControl::OnHostAudioDeviceChange().
     5243 */
     5244HRESULT Console::i_onHostAudioDeviceChange(IHostAudioDevice *aDevice, BOOL aNew, AudioDeviceState_T aState,
     5245                                           IVirtualBoxErrorInfo *aErrInfo)
     5246{
     5247    LogFlowThisFunc(("\n"));
     5248
     5249    AutoCaller autoCaller(this);
     5250    AssertComRCReturnRC(autoCaller.rc());
     5251
     5252    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     5253
     5254    HRESULT hrc = S_OK;
     5255
     5256    /** @todo Implement logic here. */
     5257
     5258    alock.release();
     5259
     5260    /* notify console callbacks on success */
     5261    if (SUCCEEDED(hrc))
     5262        ::FireHostAudioDeviceChangedEvent(mEventSource, aDevice, aNew, aState, aErrInfo);
     5263
     5264    LogFlowThisFunc(("Leaving rc=%#x\n", S_OK));
     5265    return S_OK;
     5266}
    52415267
    52425268/**
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r95369 r95423  
    30593059         * AC'97 ICH / SoundBlaster16 audio / Intel HD Audio.
    30603060         */
     3061        ComPtr<IAudioSettings> audioSettings;
     3062        hrc = pMachine->COMGETTER(AudioSettings)(audioSettings.asOutParam());               H();
     3063
    30613064        BOOL fAudioEnabled = FALSE;
    30623065        ComPtr<IAudioAdapter> audioAdapter;
    3063         hrc = pMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());                 H();
     3066        hrc = audioSettings->COMGETTER(Adapter)(audioAdapter.asOutParam());                 H();
    30643067        if (audioAdapter)
    30653068        {
  • trunk/src/VBox/Main/src-client/SessionImpl.cpp

    r94949 r95423  
    606606}
    607607
     608HRESULT Session::onHostAudioDeviceChange(const ComPtr<IHostAudioDevice> &aDevice,
     609                                         BOOL aNew, AudioDeviceState_T aState,
     610                                         const ComPtr<IVirtualBoxErrorInfo> &aErrInfo)
     611{
     612    LogFlowThisFunc(("\n"));
     613
     614    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     615    AssertReturn(mState == SessionState_Locked, VBOX_E_INVALID_VM_STATE);
     616    AssertReturn(mType == SessionType_WriteLock, VBOX_E_INVALID_OBJECT_STATE);
     617#ifndef VBOX_COM_INPROC_API_CLIENT
     618    AssertReturn(mConsole, VBOX_E_INVALID_OBJECT_STATE);
     619
     620    return mConsole->i_onHostAudioDeviceChange(aDevice, aNew, aState, aErrInfo);
     621#else
     622    RT_NOREF(aDevice, aNew, aState, aErrInfo);
     623    return S_OK;
     624#endif
     625}
     626
    608627HRESULT Session::onSerialPortChange(const ComPtr<ISerialPort> &aSerialPort)
    609628{
  • trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp

    r93115 r95423  
    115115        AutoReadLock alock1(this COMMA_LOCKVAL_SRC_POS);
    116116
    117         ComPtr<IAudioAdapter> pAudioAdapter = mAudioAdapter;
     117        ComPtr<IAudioAdapter> pAudioAdapter;
     118        rc = mAudioSettings->COMGETTER(Adapter)(pAudioAdapter.asOutParam());
     119        if (FAILED(rc)) throw rc;
    118120        BOOL fAudioEnabled;
    119121        rc = pAudioAdapter->COMGETTER(Enabled)(&fAudioEnabled);
  • trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp

    r94660 r95423  
    44874487        if (stack.strAudioAdapter.compare("null", Utf8Str::CaseInsensitive) != 0)
    44884488        {
     4489            ComPtr<IAudioSettings> audioSettings;
     4490            rc = pNewMachine->COMGETTER(AudioSettings)(audioSettings.asOutParam());
     4491            if (FAILED(rc)) throw rc;
    44894492            uint32_t audio = RTStrToUInt32(stack.strAudioAdapter.c_str());       // should be 0 for AC97
    44904493            ComPtr<IAudioAdapter> audioAdapter;
    4491             rc = pNewMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     4494            rc = audioSettings->COMGETTER(Adapter)(audioAdapter.asOutParam());
    44924495            if (FAILED(rc)) throw rc;
    44934496            rc = audioAdapter->COMSETTER(Enabled)(true);
  • trunk/src/VBox/Main/src-server/AudioAdapterImpl.cpp

    r93115 r95423  
    1919#include "AudioAdapterImpl.h"
    2020#include "MachineImpl.h"
     21#include "SystemPropertiesImpl.h"
     22#include "VirtualBoxImpl.h"
    2123
    2224#include <iprt/cpp/utils.h>
     
    6062 *  @param aParent  Handle of the parent object.
    6163 */
    62 HRESULT AudioAdapter::init(Machine *aParent)
     64HRESULT AudioAdapter::init(AudioSettings *aParent)
    6365{
    6466    LogFlowThisFunc(("aParent=%p\n", aParent));
     
    7173
    7274    /* Get the default audio driver out of the system properties */
    73     ComPtr<IVirtualBox> VBox;
    74     HRESULT rc = aParent->COMGETTER(Parent)(VBox.asOutParam());
    75     if (FAILED(rc)) return rc;
    76     ComPtr<ISystemProperties> sysProps;
    77     rc = VBox->COMGETTER(SystemProperties)(sysProps.asOutParam());
    78     if (FAILED(rc)) return rc;
     75    Machine          *pMachine    = aParent->i_getParent();
     76    ComAssertRet(pMachine, E_INVALIDARG);
     77    VirtualBox       *pVirtualBox = pMachine->i_getVirtualBox();
     78    ComAssertRet(pVirtualBox, E_INVALIDARG);
     79    SystemProperties *pSysProps   = pVirtualBox->i_getSystemProperties();
     80    ComAssertRet(pSysProps, E_INVALIDARG);
     81
    7982    AudioDriverType_T defaultAudioDriver;
    80     rc = sysProps->COMGETTER(DefaultAudioDriver)(&defaultAudioDriver);
    81     if (FAILED(rc)) return rc;
    82 
    83     unconst(mParent) = aParent;
     83    HRESULT hrc = pSysProps->COMGETTER(DefaultAudioDriver)(&defaultAudioDriver);
     84    if (FAILED(hrc)) return hrc;
     85
     86    unconst(mParent)  = aParent;
    8487    /* mPeer is left null */
    8588
    8689    mData.allocate();
    87     mData->driverType = defaultAudioDriver;
    88     mData->fEnabledIn = false;
     90    mData->driverType  = defaultAudioDriver;
     91    mData->fEnabledIn  = false;
    8992    mData->fEnabledOut = false;
    9093
     
    105108 *  @note Locks @a aThat object for reading.
    106109 */
    107 HRESULT AudioAdapter::init(Machine *aParent, AudioAdapter *aThat)
     110HRESULT AudioAdapter::init(AudioSettings *aParent, AudioAdapter *aThat)
    108111{
    109112    LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
     
    137140 *  @note Locks @a aThat object for reading.
    138141 */
    139 HRESULT AudioAdapter::initCopy(Machine *aParent, AudioAdapter *aThat)
     142HRESULT AudioAdapter::initCopy(AudioSettings *aParent, AudioAdapter *aThat)
    140143{
    141144    LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
     
    166169 *  Called either from FinalRelease() or by the parent when it gets destroyed.
    167170 */
    168 void AudioAdapter::uninit()
     171void AudioAdapter::uninit(void)
    169172{
    170173    LogFlowThisFunc(("\n"));
     
    175178        return;
    176179
     180    unconst(mPeer)   = NULL;
     181    unconst(mParent) = NULL;
     182
    177183    mData.free();
    178 
    179     unconst(mPeer) = NULL;
    180     unconst(mParent) = NULL;
    181184}
    182185
     
    195198HRESULT AudioAdapter::setEnabled(BOOL aEnabled)
    196199{
    197     /* the machine needs to be mutable */
    198     AutoMutableStateDependency adep(mParent);
    199     if (FAILED(adep.rc())) return adep.rc();
     200    AutoCaller autoCaller(this);
     201    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    200202
    201203    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     
    205207        mData.backup();
    206208        mData->fEnabled = RT_BOOL(aEnabled);
    207 
    208209        alock.release();
    209         AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);  // mParent is const, needs no locking
    210         mParent->i_setModified(Machine::IsModified_AudioAdapter);
     210
     211        mParent->i_onSettingsChanged(); // mParent is const, needs no locking
     212        mParent->i_onAdapterChanged(this);
    211213    }
    212214
     
    225227HRESULT AudioAdapter::setEnabledIn(BOOL aEnabled)
    226228{
    227     /* the machine needs to be mutable */
    228     AutoMutableOrSavedOrRunningStateDependency adep(mParent);
    229     if (FAILED(adep.rc())) return adep.rc();
    230 
    231     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     229    AutoCaller autoCaller(this);
     230    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     231
     232    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     233
    232234    if (RT_BOOL(aEnabled) != mData->fEnabledIn)
    233235    {
     
    235237        mData->fEnabledIn = RT_BOOL(aEnabled);
    236238
    237         // leave the lock before informing callbacks
    238239        alock.release();
    239240
    240         AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);
    241         mParent->i_setModified(Machine::IsModified_AudioAdapter);
    242         mlock.release();
    243 
    244         mParent->i_onAudioAdapterChange(this);
     241        mParent->i_onSettingsChanged(); // mParent is const, needs no locking
     242        mParent->i_onAdapterChanged(this);
    245243    }
    246244
     
    259257HRESULT AudioAdapter::setEnabledOut(BOOL aEnabled)
    260258{
    261     /* the machine needs to be mutable */
    262     AutoMutableOrSavedOrRunningStateDependency adep(mParent);
    263     if (FAILED(adep.rc())) return adep.rc();
    264 
    265     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     259    AutoCaller autoCaller(this);
     260    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     261
     262    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     263
    266264    if (RT_BOOL(aEnabled) != mData->fEnabledOut)
    267265    {
     
    269267        mData->fEnabledOut = RT_BOOL(aEnabled);
    270268
    271         // leave the lock before informing callbacks
    272269        alock.release();
    273270
    274         AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);
    275         mParent->i_setModified(Machine::IsModified_AudioAdapter);
    276         mlock.release();
    277 
    278         mParent->i_onAudioAdapterChange(this);
     271        mParent->i_onSettingsChanged(); // mParent is const, needs no locking
     272        mParent->i_onAdapterChanged(this);
    279273    }
    280274
     
    293287HRESULT AudioAdapter::setAudioDriver(AudioDriverType_T aAudioDriver)
    294288{
    295 
    296     /* the machine needs to be mutable */
    297     AutoMutableOrSavedStateDependency adep(mParent);
    298     if (FAILED(adep.rc())) return adep.rc();
     289    AutoCaller autoCaller(this);
     290    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    299291
    300292    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     
    308300            mData.backup();
    309301            mData->driverType = aAudioDriver;
     302
    310303            alock.release();
    311             AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);  // mParent is const, needs no locking
    312             mParent->i_setModified(Machine::IsModified_AudioAdapter);
     304
     305            mParent->i_onSettingsChanged(); // mParent is const, needs no locking
    313306        }
    314307        else
     
    333326HRESULT AudioAdapter::setAudioController(AudioControllerType_T aAudioController)
    334327{
    335     /* the machine needs to be mutable */
    336     AutoMutableStateDependency adep(mParent);
    337     if (FAILED(adep.rc())) return adep.rc();
    338 
    339     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    340 
    341     HRESULT rc = S_OK;
     328    AutoCaller autoCaller(this);
     329    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     330
     331    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     332
     333    HRESULT hrc = S_OK;
    342334
    343335    if (mData->controllerType != aAudioController)
     
    364356                AssertMsgFailed(("Wrong audio controller type %d\n", aAudioController));
    365357                defaultCodec = AudioCodecType_Null; /* Shut up MSC */
    366                 rc = E_FAIL;
    367         }
    368         if (rc == S_OK)
     358                hrc = E_FAIL;
     359        }
     360
     361        if (SUCCEEDED(hrc))
    369362        {
    370363            mData.backup();
    371364            mData->controllerType = aAudioController;
    372             mData->codecType = defaultCodec;
     365            mData->codecType      = defaultCodec;
     366
    373367            alock.release();
    374             AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);  // mParent is const, needs no locking
    375             mParent->i_setModified(Machine::IsModified_AudioAdapter);
    376         }
    377     }
    378 
    379     return rc;
     368
     369            mParent->i_onSettingsChanged(); // mParent is const, needs no locking
     370        }
     371    }
     372
     373    return hrc;
    380374}
    381375
     
    391385HRESULT AudioAdapter::setAudioCodec(AudioCodecType_T aAudioCodec)
    392386{
    393     /* the machine needs to be mutable */
    394     AutoMutableStateDependency adep(mParent);
    395     if (FAILED(adep.rc())) return adep.rc();
    396 
    397     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    398 
    399     HRESULT rc = S_OK;
     387    AutoCaller autoCaller(this);
     388    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     389
     390    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     391
     392    HRESULT hrc = S_OK;
    400393
    401394    /*
     
    408401            if (   (aAudioCodec != AudioCodecType_STAC9700)
    409402                && (aAudioCodec != AudioCodecType_AD1980))
    410                 rc = E_INVALIDARG;
     403                hrc = E_INVALIDARG;
    411404            break;
    412405        }
     
    415408        {
    416409            if (aAudioCodec != AudioCodecType_SB16)
    417                 rc = E_INVALIDARG;
     410                hrc = E_INVALIDARG;
    418411            break;
    419412        }
     
    422415        {
    423416            if (aAudioCodec != AudioCodecType_STAC9221)
    424                 rc = E_INVALIDARG;
     417                hrc = E_INVALIDARG;
    425418            break;
    426419        }
     
    429422            AssertMsgFailed(("Wrong audio controller type %d\n",
    430423                             mData->controllerType));
    431             rc = E_FAIL;
    432     }
    433 
    434     if (!SUCCEEDED(rc))
    435         return setError(rc,
     424            hrc = E_FAIL;
     425    }
     426
     427    if (!SUCCEEDED(hrc))
     428        return setError(hrc,
    436429                        tr("Invalid audio codec type %d"),
    437430                        aAudioCodec);
     
    441434        mData.backup();
    442435        mData->codecType = aAudioCodec;
     436
    443437        alock.release();
    444         AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);  // mParent is const, needs no locking
    445         mParent->i_setModified(Machine::IsModified_AudioAdapter);
    446     }
    447 
    448     return rc;
     438
     439        mParent->i_onSettingsChanged(); // mParent is const, needs no locking
     440    }
     441
     442    return hrc;
    449443}
    450444
  • trunk/src/VBox/Main/src-server/HostImpl.cpp

    r95065 r95423  
    10091009    ReturnComNotImplemented();
    10101010#endif
     1011}
     1012
     1013HRESULT Host::getAudioDevices(std::vector<ComPtr<IHostAudioDevice> > &aAudioDevices)
     1014{
     1015    RT_NOREF(aAudioDevices);
     1016    ReturnComNotImplemented();
    10111017}
    10121018
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r95339 r95423  
    26842684}
    26852685
    2686 HRESULT Machine::getAudioAdapter(ComPtr<IAudioAdapter> &aAudioAdapter)
     2686HRESULT Machine::getAudioSettings(ComPtr<IAudioSettings> &aAudioSettings)
    26872687{
    26882688    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    26892689
    2690     aAudioAdapter = mAudioAdapter;
     2690    aAudioSettings = mAudioSettings;
    26912691
    26922692    return S_OK;
     
    86698669    }
    86708670
    8671     /* create the audio adapter object (always present, default is disabled) */
    8672     unconst(mAudioAdapter).createObject();
    8673     mAudioAdapter->init(this);
     8671    /* create the audio settings object */
     8672    unconst(mAudioSettings).createObject();
     8673    mAudioSettings->init(this);
    86748674
    86758675    /* create the USB device filters object (always present) */
     
    87328732    }
    87338733
    8734     if (mAudioAdapter)
    8735     {
    8736         mAudioAdapter->uninit();
    8737         unconst(mAudioAdapter).setNull();
     8734    if (mAudioSettings)
     8735    {
     8736        mAudioSettings->uninit();
     8737        unconst(mAudioSettings).setNull();
    87388738    }
    87398739
     
    94259425        }
    94269426
    9427         /* AudioAdapter */
    9428         rc = mAudioAdapter->i_loadSettings(data.audioAdapter);
     9427        /* Audio settings */
     9428        rc = mAudioSettings->i_loadSettings(data.audioAdapter);
    94299429        if (FAILED(rc)) return rc;
    94309430
     
    1084910849        }
    1085010850
    10851         /* Audio adapter */
    10852         rc = mAudioAdapter->i_saveSettings(data.audioAdapter);
     10851        /* Audio settings */
     10852        rc = mAudioSettings->i_saveSettings(data.audioAdapter);
    1085310853        if (FAILED(rc)) return rc;
    1085410854
     
    1229812298        mVRDEServer->i_rollback();
    1229912299
    12300     if (mAudioAdapter && (mData->flModifications & IsModified_AudioAdapter))
    12301         mAudioAdapter->i_rollback();
     12300    if (mAudioSettings && (mData->flModifications & IsModified_AudioSettings))
     12301        mAudioSettings->i_rollback();
    1230212302
    1230312303    if (mUSBDeviceFilters && (mData->flModifications & IsModified_USB))
     
    1241912419    mGraphicsAdapter->i_commit();
    1242012420    mVRDEServer->i_commit();
    12421     mAudioAdapter->i_commit();
     12421    mAudioSettings->i_commit();
    1242212422    mUSBDeviceFilters->i_commit();
    1242312423    mBandwidthControl->i_commit();
     
    1267512675    mGraphicsAdapter->i_copyFrom(aThat->mGraphicsAdapter);
    1267612676    mVRDEServer->i_copyFrom(aThat->mVRDEServer);
    12677     mAudioAdapter->i_copyFrom(aThat->mAudioAdapter);
     12677    mAudioSettings->i_copyFrom(aThat->mAudioSettings);
    1267812678    mUSBDeviceFilters->i_copyFrom(aThat->mUSBDeviceFilters);
    1267912679    mBandwidthControl->i_copyFrom(aThat->mBandwidthControl);
     
    1306213062    unconst(mVRDEServer).createObject();
    1306313063    mVRDEServer->init(this, aMachine->mVRDEServer);
    13064     /* create another audio adapter object that will be mutable */
    13065     unconst(mAudioAdapter).createObject();
    13066     mAudioAdapter->init(this, aMachine->mAudioAdapter);
     13064    /* create another audio settings object that will be mutable */
     13065    unconst(mAudioSettings).createObject();
     13066    mAudioSettings->init(this, aMachine->mAudioSettings);
    1306713067    /* create a list of serial ports that will be mutable */
    1306813068    for (ULONG slot = 0; slot < RT_ELEMENTS(mSerialPorts); ++slot)
     
    1453914539 *  @note Locks this object for reading.
    1454014540 */
     14541HRESULT SessionMachine::i_onHostAudioDeviceChange(IHostAudioDevice *aDevice, BOOL aNew, AudioDeviceState_T aState, IVirtualBoxErrorInfo *aErrInfo)
     14542{
     14543    LogFlowThisFunc(("\n"));
     14544
     14545    AutoCaller autoCaller(this);
     14546    AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
     14547
     14548    ComPtr<IInternalSessionControl> directControl;
     14549    {
     14550        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     14551        if (mData->mSession.mLockType == LockType_VM)
     14552            directControl = mData->mSession.mDirectControl;
     14553    }
     14554
     14555    /* ignore notifications sent after #OnSessionEnd() is called */
     14556    if (!directControl)
     14557        return S_OK;
     14558
     14559    return directControl->OnHostAudioDeviceChange(aDevice, aNew, aState, aErrInfo);
     14560}
     14561
     14562/**
     14563 *  @note Locks this object for reading.
     14564 */
    1454114565HRESULT SessionMachine::i_onSerialPortChange(ISerialPort *serialPort)
    1454214566{
     
    1582315847
    1582415848    /* Audio stuff. */
    15825     AudioControllerType_T audioController;
    15826     rc = osType->COMGETTER(RecommendedAudioController)(&audioController);
    15827     if (FAILED(rc)) return rc;
    15828 
    15829     rc = mAudioAdapter->COMSETTER(AudioController)(audioController);
    15830     if (FAILED(rc)) return rc;
    15831 
    15832     AudioCodecType_T audioCodec;
    15833     rc = osType->COMGETTER(RecommendedAudioCodec)(&audioCodec);
    15834     if (FAILED(rc)) return rc;
    15835 
    15836     rc = mAudioAdapter->COMSETTER(AudioCodec)(audioCodec);
    15837     if (FAILED(rc)) return rc;
    15838 
    15839     rc = mAudioAdapter->COMSETTER(Enabled)(true);
    15840     if (FAILED(rc)) return rc;
    15841 
    15842     rc = mAudioAdapter->COMSETTER(EnabledOut)(true);
     15849    rc = mAudioSettings->i_applyDefaults(osType);
    1584315850    if (FAILED(rc)) return rc;
    1584415851
  • trunk/src/VBox/Main/src-server/SnapshotImpl.cpp

    r94864 r95423  
    11881188    if (FAILED(rc)) return rc;
    11891189
    1190     unconst(mAudioAdapter).createObject();
    1191     rc = mAudioAdapter->initCopy(this, pMachine->mAudioAdapter);
     1190    unconst(mAudioSettings).createObject();
     1191    rc = mAudioSettings->initCopy(this, pMachine->mAudioSettings);
    11921192    if (FAILED(rc)) return rc;
    11931193
     
    13211321    mVRDEServer->init(this);
    13221322
    1323     unconst(mAudioAdapter).createObject();
    1324     mAudioAdapter->init(this);
     1323    unconst(mAudioSettings).createObject();
     1324    mAudioSettings->init(this);
    13251325
    13261326    unconst(mUSBDeviceFilters).createObject();
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette