mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 796300 - Final version: Set audio device BLUETOOTH_SCO_HEADSET to unavailable when disconnect Sco socket, r=qdot
This commit is contained in:
parent
859bce8726
commit
78c37a4bca
@ -16,6 +16,7 @@
|
||||
#include "mozilla/dom/bluetooth/BluetoothTypes.h"
|
||||
#include "mozilla/Services.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsIAudioManager.h"
|
||||
#include "nsIObserverService.h"
|
||||
#include "nsIRadioInterfaceLayer.h"
|
||||
#include "nsISystemMessagesInternal.h"
|
||||
@ -26,6 +27,7 @@
|
||||
#include <unistd.h> /* usleep() */
|
||||
|
||||
#define MOZSETTINGS_CHANGED_ID "mozsettings-changed"
|
||||
#define BLUETOOTH_SCO_STATUS_CHANGED "bluetooth-sco-status-changed"
|
||||
#define AUDIO_VOLUME_MASTER "audio.volume.master"
|
||||
|
||||
USING_BLUETOOTH_NAMESPACE
|
||||
@ -82,14 +84,29 @@ CloseScoSocket()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
nsCOMPtr<nsIAudioManager> am = do_GetService("@mozilla.org/telephony/audiomanager;1");
|
||||
if (!am) {
|
||||
NS_WARNING("Failed to get AudioManager Service!");
|
||||
return;
|
||||
}
|
||||
am->SetForceForUse(am->USE_COMMUNICATION, am->FORCE_NONE);
|
||||
|
||||
BluetoothScoManager* sco = BluetoothScoManager::Get();
|
||||
if (!sco) {
|
||||
NS_WARNING("BluetoothScoManager is not available!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (sco->GetConnected())
|
||||
if (sco->GetConnected()) {
|
||||
nsCOMPtr<nsIObserverService> obs = do_GetService("@mozilla.org/observer-service;1");
|
||||
if (obs) {
|
||||
if (NS_FAILED(obs->NotifyObservers(nullptr, BLUETOOTH_SCO_STATUS_CHANGED, nullptr))) {
|
||||
NS_WARNING("Failed to notify bluetooth-sco-status-changed observsers!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
sco->Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
BluetoothHfpManager::BluetoothHfpManager()
|
||||
|
@ -190,6 +190,9 @@ public:
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
nsCOMPtr<nsIAudioManager> am = do_GetService("@mozilla.org/telephony/audiomanager;1");
|
||||
if (!am) {
|
||||
NS_WARNING("Failed to get AudioManager service!");
|
||||
}
|
||||
am->SetForceForUse(am->USE_COMMUNICATION, am->FORCE_BT_SCO);
|
||||
|
||||
nsCOMPtr<nsIObserverService> obs = do_GetService("@mozilla.org/observer-service;1");
|
||||
|
@ -36,7 +36,6 @@ using namespace mozilla;
|
||||
|
||||
// A bitwise variable for recording what kind of headset is attached.
|
||||
static int sHeadsetState;
|
||||
static const char* sDeviceAddress;
|
||||
static int kBtSampleRate = 8000;
|
||||
|
||||
static bool
|
||||
@ -80,10 +79,6 @@ InternalSetAudioRoutesICS(SwitchState aState)
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_WIRED_HEADPHONE,
|
||||
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, "");
|
||||
sHeadsetState |= AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
|
||||
} else if (aState == SWITCH_STATE_BLUETOOTH_SCO) {
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
|
||||
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, sDeviceAddress);
|
||||
sHeadsetState |= AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
|
||||
} else if (aState == SWITCH_STATE_OFF) {
|
||||
AudioSystem::setDeviceConnectionState(static_cast<audio_devices_t>(sHeadsetState),
|
||||
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
|
||||
@ -135,12 +130,22 @@ AudioManager::Observe(nsISupports* aSubject,
|
||||
const PRUnichar* aData)
|
||||
{
|
||||
if (!strcmp(aTopic, BLUETOOTH_SCO_STATUS_CHANGED)) {
|
||||
String8 cmd;
|
||||
cmd.appendFormat("bt_samplerate=%d", kBtSampleRate);
|
||||
AudioSystem::setParameters(0, cmd);
|
||||
if (aData) {
|
||||
String8 cmd;
|
||||
cmd.appendFormat("bt_samplerate=%d", kBtSampleRate);
|
||||
AudioSystem::setParameters(0, cmd);
|
||||
const char* address = NS_ConvertUTF16toUTF8(nsDependentString(aData)).get();
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
|
||||
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, address);
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
|
||||
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, address);
|
||||
} else {
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
|
||||
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
|
||||
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
|
||||
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
|
||||
}
|
||||
|
||||
sDeviceAddress = NS_ConvertUTF16toUTF8(nsDependentString(aData)).get();
|
||||
InternalSetAudioRoutes(SwitchState::SWITCH_STATE_BLUETOOTH_SCO);
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
@ -62,7 +62,6 @@ enum SwitchState {
|
||||
SWITCH_STATE_OFF,
|
||||
SWITCH_STATE_HEADSET, // Headphone with microphone
|
||||
SWITCH_STATE_HEADPHONE, // without microphone
|
||||
SWITCH_STATE_BLUETOOTH_SCO,
|
||||
NUM_SWITCH_STATE
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user