fix: Fixed audio device selection error under Linux. (#1864)

* fix audio device select bug for linux.

* fix CI for elinux.
This commit is contained in:
CloudWebRTC
2025-06-17 21:17:55 +08:00
committed by GitHub
parent 8f0584b1fd
commit 17dbc1132c
2 changed files with 28 additions and 22 deletions

View File

@ -136,7 +136,7 @@ jobs:
- name: Install ninja-build libgtk-3-dev
run: sudo apt-get install -y ninja-build libgtk-3-dev
- name: Install elinux
run: git clone https://github.com/sony/flutter-elinux.git ~/flutter-elinux
run: git clone https://github.com/sony/flutter-elinux.git -b 3.27.1 ~/flutter-elinux
- name: Build for elinux
working-directory: ./example
run: /home/runner/flutter-elinux/bin/flutter-elinux pub get && /home/runner/flutter-elinux/bin/flutter-elinux build elinux

View File

@ -288,7 +288,6 @@ void FlutterMediaStream::GetUserVideo(const EncodableMap& constraints,
if (!video_capturer.get())
return;
video_capturer->StartCapture();
const char* video_source_label = "video_input";
@ -333,10 +332,11 @@ void FlutterMediaStream::GetSources(std::unique_ptr<MethodResultProxy> result) {
for (uint16_t i = 0; i < nb_audio_devices; i++) {
base_->audio_device_->RecordingDeviceName(i, strNameUTF8, strGuidUTF8);
std::string device_id = strlen(strGuidUTF8) > 0 ? std::string(strGuidUTF8)
: std::string(strNameUTF8);
EncodableMap audio;
audio[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8));
audio[EncodableValue("deviceId")] =
EncodableValue(std::string(strGuidUTF8));
audio[EncodableValue("deviceId")] = EncodableValue(device_id);
audio[EncodableValue("facing")] = "";
audio[EncodableValue("kind")] = "audioinput";
sources.push_back(EncodableValue(audio));
@ -345,10 +345,11 @@ void FlutterMediaStream::GetSources(std::unique_ptr<MethodResultProxy> result) {
nb_audio_devices = base_->audio_device_->PlayoutDevices();
for (uint16_t i = 0; i < nb_audio_devices; i++) {
base_->audio_device_->PlayoutDeviceName(i, strNameUTF8, strGuidUTF8);
std::string device_id = strlen(strGuidUTF8) > 0 ? std::string(strGuidUTF8)
: std::string(strNameUTF8);
EncodableMap audio;
audio[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8));
audio[EncodableValue("deviceId")] =
EncodableValue(std::string(strGuidUTF8));
audio[EncodableValue("deviceId")] = EncodableValue(device_id);
audio[EncodableValue("facing")] = "";
audio[EncodableValue("kind")] = "audiooutput";
sources.push_back(EncodableValue(audio));
@ -373,13 +374,16 @@ void FlutterMediaStream::GetSources(std::unique_ptr<MethodResultProxy> result) {
void FlutterMediaStream::SelectAudioOutput(
const std::string& device_id,
std::unique_ptr<MethodResultProxy> result) {
char strPlayoutName[256];
char strPlayoutGuid[256];
char deviceName[256];
char deviceGuid[256];
int playout_devices = base_->audio_device_->PlayoutDevices();
bool found = false;
for (uint16_t i = 0; i < playout_devices; i++) {
base_->audio_device_->PlayoutDeviceName(i, strPlayoutName, strPlayoutGuid);
if (device_id != "" && device_id == strPlayoutGuid) {
base_->audio_device_->PlayoutDeviceName(i, deviceName, deviceGuid);
std::string cur_device_id = strlen(deviceGuid) > 0
? std::string(deviceGuid)
: std::string(deviceName);
if (device_id != "" && device_id == cur_device_id) {
base_->audio_device_->SetPlayoutDevice(i);
found = true;
break;
@ -395,14 +399,16 @@ void FlutterMediaStream::SelectAudioOutput(
void FlutterMediaStream::SelectAudioInput(
const std::string& device_id,
std::unique_ptr<MethodResultProxy> result) {
char strPlayoutName[256];
char strPlayoutGuid[256];
char deviceName[256];
char deviceGuid[256];
int playout_devices = base_->audio_device_->RecordingDevices();
bool found = false;
for (uint16_t i = 0; i < playout_devices; i++) {
base_->audio_device_->RecordingDeviceName(i, strPlayoutName,
strPlayoutGuid);
if (device_id != "" && device_id == strPlayoutGuid) {
base_->audio_device_->RecordingDeviceName(i, deviceName, deviceGuid);
std::string cur_device_id = strlen(deviceGuid) > 0
? std::string(deviceGuid)
: std::string(deviceName);
if (device_id != "" && device_id == cur_device_id) {
base_->audio_device_->SetRecordingDevice(i);
found = true;
break;
@ -538,14 +544,14 @@ void FlutterMediaStream::MediaStreamTrackDispose(
if (track->id().std_string() == track_id) {
stream->RemoveTrack(track);
if (base_->video_capturers_.find(track_id) !=
base_->video_capturers_.end()) {
auto video_capture = base_->video_capturers_[track_id];
if (video_capture->CaptureStarted()) {
video_capture->StopCapture();
if (base_->video_capturers_.find(track_id) !=
base_->video_capturers_.end()) {
auto video_capture = base_->video_capturers_[track_id];
if (video_capture->CaptureStarted()) {
video_capture->StopCapture();
}
base_->video_capturers_.erase(track_id);
}
base_->video_capturers_.erase(track_id);
}
}
}
}