Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
2d07031
WIP: Added Audio device selector implementation
Mayank4352 Oct 31, 2025
c1d7b8d
feat: Added the Functionality to chnage the preffered audio device
Mayank4352 Nov 12, 2025
7afcadc
feat: Added tests and updated ui elements
Mayank4352 Nov 12, 2025
e5ff288
fix: replaced the leave button with simple end call icon
Mayank4352 Nov 12, 2025
01eb7b6
Merge branch 'dev' into output_change
Mayank4352 Nov 23, 2025
ec60ba4
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Nov 23, 2025
11ee681
Merge branch 'output_change' of https://github.com/Mayank4352/Resonat…
Mayank4352 Nov 23, 2025
18aa444
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Nov 23, 2025
8d7e98f
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Jan 7, 2026
8aab6cb
Fix: Made the requested changes
Mayank4352 Jan 7, 2026
4a610ac
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Jan 7, 2026
6fa806e
Fix: Made the requested changes
Mayank4352 Jan 7, 2026
e00552f
Feat: Added translations for punjabi
Mayank4352 Jan 8, 2026
a81921b
Feat: Made Enums for the device names
Mayank4352 Jan 8, 2026
a6567ff
Fix: Updated unit tests
Mayank4352 Jan 8, 2026
3a5f784
refactor: inlined functions and updated tests
Mayank4352 Jan 9, 2026
98d229e
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Jan 10, 2026
a81a246
refactor: Made enum the part of AudioDevice class
Mayank4352 Jan 10, 2026
1ac8ca9
Merge branch 'dev' of https://github.com/AOSSIE-Org/Resonate into out…
Mayank4352 Jan 11, 2026
8837249
refactor: Refactored the controller file
Mayank4352 Jan 11, 2026
66f3c49
feat: Updated the tests for audio controller
Mayank4352 Jan 11, 2026
220d643
fix: Made requested changes
Mayank4352 Jan 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions lib/controllers/audio_device_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import 'dart:async';
import 'dart:developer';

import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc;
import 'package:get/get.dart';
import 'package:resonate/models/audio_device.dart';
import 'package:resonate/utils/enums/audio_device_enum.dart';

class AudioDeviceController extends GetxController {
final RxList<AudioDevice> audioOutputDevices = <AudioDevice>[].obs;
final Rx<AudioDevice?> selectedAudioOutput = Rx<AudioDevice?>(null);

Timer? _deviceEnumerationTimer;

@override
void onInit() {
super.onInit();
enumerateDevices();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await the first call as well

_deviceEnumerationTimer = Timer.periodic(
const Duration(seconds: 5),
(_) => enumerateDevices(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refactor to await these calls, as it is an async function

);
}
Comment on lines 15 to 23
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Prevent overlapping polls + keep selection consistent with current device list.

Timer.periodic can re-enter enumerateDevices() while a prior call is still in-flight, and selectedAudioOutput can remain set to a device that no longer exists.

Proposed fix (in-flight guard + selection reconciliation)
 class AudioDeviceController extends GetxController {
   final RxList<AudioDevice> audioOutputDevices = <AudioDevice>[].obs;
   final Rx<AudioDevice?> selectedAudioOutput = Rx<AudioDevice?>(null);

   Timer? _deviceEnumerationTimer;
+  bool _isEnumerating = false;

   @override
   void onInit() {
     super.onInit();
     enumerateDevices();
     _deviceEnumerationTimer = Timer.periodic(
       const Duration(seconds: 5),
       (_) => enumerateDevices(),
     );
   }

   Future<void> enumerateDevices() async {
+    if (_isEnumerating) return;
+    _isEnumerating = true;
     try {
       final devices = await webrtc.navigator.mediaDevices.enumerateDevices();
       final outputs = devices
           .map((device) => AudioDevice.fromMediaDeviceInfo(device))
           .where((d) => d.isAudioOutput)
           .toList();
       audioOutputDevices.value = outputs;
-      selectedAudioOutput.value ??= outputs.firstOrNull;
+      final selectedId = selectedAudioOutput.value?.deviceId;
+      final stillPresent = selectedId != null &&
+          outputs.any((d) => d.deviceId == selectedId);
+      if (!stillPresent) {
+        selectedAudioOutput.value = outputs.firstOrNull;
+      }
       log('Enumerated ${outputs.length} output devices');
     } catch (e) {
       log('Error enumerating devices: $e');
+    } finally {
+      _isEnumerating = false;
     }
   }

Also applies to: 31-44


@override
void onClose() {
_deviceEnumerationTimer?.cancel();
super.onClose();
}

Future<void> enumerateDevices() async {
try {
final devices = await webrtc.navigator.mediaDevices.enumerateDevices();
final outputs = devices
.map((device) => AudioDevice.fromMediaDeviceInfo(device))
.where((d) => d.isAudioOutput)
.toList();
audioOutputDevices.value = outputs;
selectedAudioOutput.value ??= outputs.firstOrNull;
log('Enumerated ${outputs.length} output devices');
} catch (e) {
log('Error enumerating devices: $e');
}
}

Future<void> selectAudioOutput(AudioDevice device) async {
try {
selectedAudioOutput.value = device;
await webrtc.Helper.selectAudioOutput(device.deviceId);
log('Selected audio output: ${device.label}');
} catch (e) {
log('Error selecting audio output: $e');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move this, like CodeRabbit suggested

}
}
Comment on lines 46 to 57
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "audio_device_controller.dart" -type f

Repository: AOSSIE-Org/Resonate

Length of output: 109


🏁 Script executed:

cat -n ./lib/controllers/audio_device_controller.dart | head -70

Repository: AOSSIE-Org/Resonate

Length of output: 2679


🏁 Script executed:

cat -n ./lib/controllers/audio_device_controller.dart | tail -30

Repository: AOSSIE-Org/Resonate

Length of output: 1115


🏁 Script executed:

# Search for other device selection methods in the controller
rg "selectAudio|setAudio" ./lib/controllers/audio_device_controller.dart

Repository: AOSSIE-Org/Resonate

Length of output: 185


🏁 Script executed:

# Search for all methods that set selectedAudio* values in this file
rg "selectedAudio" ./lib/controllers/audio_device_controller.dart

Repository: AOSSIE-Org/Resonate

Length of output: 232


🏁 Script executed:

# Check if there's a selectAudioInput method with the same pattern
rg -A 10 "selectAudioInput|inputDevice" ./lib/controllers/audio_device_controller.dart

Repository: AOSSIE-Org/Resonate

Length of output: 45


🏁 Script executed:

# Search for webrtc.Helper.selectAudioOutput usage elsewhere
rg "selectAudioOutput" --type dart

Repository: AOSSIE-Org/Resonate

Length of output: 665


🏁 Script executed:

cat -n ./test/controllers/audio_device_controller_test.dart

Repository: AOSSIE-Org/Resonate

Length of output: 6991


Move selectedAudioOutput.value = device after the system-level switch succeeds to prevent UI state from diverging if the operation fails.

Currently, selectedAudioOutput.value is set before awaiting webrtc.Helper.selectAudioOutput(). If the system call throws an exception, the UI shows the device as selected even though the actual switch failed. The error handler only logs the error without reverting the UI state.

Proposed fix
   Future<void> selectAudioOutput(AudioDevice device) async {
     try {
-      selectedAudioOutput.value = device;
       await webrtc.Helper.selectAudioOutput(device.deviceId);
+      selectedAudioOutput.value = device;
       log('Selected audio output: ${device.label}');
     } catch (e) {
       log('Error selecting audio output: $e');
     }
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Future<void> selectAudioOutput(AudioDevice device) async {
try {
selectedAudioOutput.value = device;
await webrtc.Helper.selectAudioOutput(device.deviceId);
log('Selected audio output: ${device.label}');
} catch (e) {
log('Error selecting audio output: $e');
}
}
Future<void> selectAudioOutput(AudioDevice device) async {
try {
await webrtc.Helper.selectAudioOutput(device.deviceId);
selectedAudioOutput.value = device;
log('Selected audio output: ${device.label}');
} catch (e) {
log('Error selecting audio output: $e');
}
}
🤖 Prompt for AI Agents
In @lib/controllers/audio_device_controller.dart around lines 46 - 54, In
selectAudioOutput move the UI state update so it only happens after the system
call succeeds: call await webrtc.Helper.selectAudioOutput(device.deviceId)
first, then set selectedAudioOutput.value = device; additionally capture the
previous selectedAudioOutput.value before attempting the switch and in the catch
block either leave it unchanged or explicitly revert to the captured previous
device and log the error (use the existing log call). Ensure you reference the
selectAudioOutput function, selectedAudioOutput.value, and
webrtc.Helper.selectAudioOutput when making the change.


AudioDeviceType getDeviceType(AudioDevice device) {
return AudioDeviceType.fromLabel(device.label);
}

String getDeviceName(AudioDevice device) {
final deviceType = getDeviceType(device);
log('Device label: "${device.label}" -> type: ${deviceType.name}');

if (deviceType == AudioDeviceType.bluetoothAudio) {
return device.label;
} else if (deviceType == AudioDeviceType.unknown &&
device.label.isNotEmpty) {
return device.label;
}
return device.label.isNotEmpty ? deviceType.displayName : 'Unknown Device';
}

String getDeviceIcon(AudioDevice device) {
return getDeviceType(device).iconName;
}

Future<void> refreshDevices() async {
await enumerateDevices();
}
}
10 changes: 10 additions & 0 deletions lib/controllers/friend_call_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:resonate/controllers/friend_calling_controller.dart';
import 'package:resonate/themes/theme_controller.dart';
import 'package:resonate/utils/ui_sizes.dart';
import 'package:resonate/views/widgets/room_header.dart';
import 'package:resonate/views/widgets/audio_selector_dialog.dart';

import 'package:resonate/l10n/app_localizations.dart';

Expand Down Expand Up @@ -128,6 +129,15 @@ class FriendCallScreen extends StatelessWidget {
: _getControlButtonBackgroundColor(currentBrightness),
heroTag: "speaker",
),
_buildControlButton(
icon: Icons.settings_voice,
label: 'Audio Options',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use translated string

onPressed: () async => await showAudioDeviceSelector(context),
backgroundColor: _getControlButtonBackgroundColor(
currentBrightness,
),
heroTag: "audio-settings",
),
_buildControlButton(
icon: Icons.cancel_outlined,
label: AppLocalizations.of(context)!.end,
Expand Down
20 changes: 20 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,26 @@
"noRecordingError": "You have not recorded anything for the chapter. Please record a chapter before exiting the room",
"@noRecordingError": {
"description": "Error message when trying to exit a live chapter room without any recording."
},
"audioOutput": "Audio Output",
"@audioOutput": {
"description": "Title for audio output device selector."
},
"selectPreferredSpeaker": "Select your preferred speaker",
"@selectPreferredSpeaker": {
"description": "Subtitle for audio device selector dialog."
},
"noAudioOutputDevices": "No audio output devices detected",
"@noAudioOutputDevices": {
"description": "Message shown when no audio output devices are available."
},
"refresh": "Refresh",
"@refresh": {
"description": "Button text to refresh audio device list."
},
"done": "Done",
"@done": {
"description": "Button text to close audio device selector."
},
"deleteMessageTitle": "Delete Message",
"@deleteMessageTitle": {
Expand Down
20 changes: 20 additions & 0 deletions lib/l10n/app_hi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -1758,6 +1758,26 @@
"@noRecordingError": {
"description": "Error message when trying to exit a live chapter room without any recording."
},
"audioOutput": "ऑडियो आउटपुट",
"@audioOutput": {
"description": "Title for audio output device selector."
},
"selectPreferredSpeaker": "अपना पसंदीदा स्पीकर चुनें",
"@selectPreferredSpeaker": {
"description": "Subtitle for audio device selector dialog."
},
"noAudioOutputDevices": "कोई ऑडियो आउटपुट डिवाइस नहीं मिला",
"@noAudioOutputDevices": {
"description": "Message shown when no audio output devices are available."
},
"refresh": "रीफ़्रेश करें",
"@refresh": {
"description": "Button text to refresh audio device list."
},
"done": "हो गया",
"@done": {
"description": "Button text to close audio device selector."
},
"deleteMessageTitle": "संदेश हटाएँ",
"@deleteMessageTitle": {
"description": "Title shown in the delete message confirmation dialog."
Expand Down
30 changes: 30 additions & 0 deletions lib/l10n/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2470,6 +2470,36 @@ abstract class AppLocalizations {
/// **'You have not recorded anything for the chapter. Please record a chapter before exiting the room'**
String get noRecordingError;

/// Title for audio output device selector.
///
/// In en, this message translates to:
/// **'Audio Output'**
String get audioOutput;

/// Subtitle for audio device selector dialog.
///
/// In en, this message translates to:
/// **'Select your preferred speaker'**
String get selectPreferredSpeaker;

/// Message shown when no audio output devices are available.
///
/// In en, this message translates to:
/// **'No audio output devices detected'**
String get noAudioOutputDevices;

/// Button text to refresh audio device list.
///
/// In en, this message translates to:
/// **'Refresh'**
String get refresh;

/// Button text to close audio device selector.
///
/// In en, this message translates to:
/// **'Done'**
String get done;

/// Title shown in the delete message confirmation dialog.
///
/// In en, this message translates to:
Expand Down
23 changes: 19 additions & 4 deletions lib/l10n/app_localizations_bn.dart
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ class AppLocalizationsBn extends AppLocalizations {
String get continueWithGitHub => 'GitHub দিয়ে সাইন ইন করুন';

@override
String get resonateLogo => 'রেজোনেট লোগো';
String get resonateLogo => 'রেজোনেট লোগো';

@override
String get iAlreadyHaveAnAccount => 'আপনার ইতিমধ্যেই একটি অ্যাকাউন্ট আছে';
Expand Down Expand Up @@ -591,7 +591,7 @@ class AppLocalizationsBn extends AppLocalizations {
String get scheduledDateTimePast => 'নির্ধারিত তারিখ-সময় অতীতের হতে পারে না';

@override
String get joinRoom => 'রুমে যোগ দিন';
String get joinRoom => 'রুমে যোগ দিন';

@override
String get unknownUser => 'অজানা';
Expand Down Expand Up @@ -770,7 +770,7 @@ class AppLocalizationsBn extends AppLocalizations {
String description,
int participants,
) {
return '🚀এই অসাধারণ রুমটি দেখুন: $roomName!\n\n📖 বিবরণ: $description\n👥 এখনই $participants অংশগ্রহণকারীদের সাথে যোগ দিন!';
return '🚀এই অসাধারণ রুমটি দেখুন: $roomName!\n\n📖 বিবরণ: $description\n👥 এখনই $participants অংশগ্রহণকারীদের সাথে যোগ দিন!';
}

@override
Expand Down Expand Up @@ -813,7 +813,7 @@ class AppLocalizationsBn extends AppLocalizations {

@override
String get unableToReconnect =>
'রুমে পুনরায় সংযোগ করা সম্ভব হচ্ছে না। অনুগ্রহ করে আবার যোগ দেওয়ার চেষ্টা করুন।';
'রুমে পুনরায় সংযোগ করা সম্ভব হচ্ছে না। অনুগ্রহ করে আবার যোগ দেওয়ার চেষ্টা করুন।';

@override
String get invalidFormat => 'অবৈধ ফর্ম্যাট!';
Expand Down Expand Up @@ -1354,6 +1354,21 @@ class AppLocalizationsBn extends AppLocalizations {
String get noRecordingError =>
'আপনি অধ্যায়টির জন্য কিছুই রেকর্ড করোনি। রুম থেকে বের হওয়ার আগে অনুগ্রহ করে একটি অধ্যায় রেকর্ড করুন।';

@override
String get audioOutput => 'Audio Output';

@override
String get selectPreferredSpeaker => 'Select your preferred speaker';

@override
String get noAudioOutputDevices => 'No audio output devices detected';

@override
String get refresh => 'Refresh';

@override
String get done => 'Done';

Comment on lines +1360 to +1374
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

English strings used instead of Bengali translations.

Lines 1357-1371 contain English strings instead of proper Bengali (বাংলা) translations. This defeats the purpose of localization for Bengali users.

The strings should be translated to Bengali:

  • 'Audio Output' → should be in Bengali
  • 'Select your preferred speaker' → should be in Bengali
  • 'No audio output devices detected' → should be in Bengali
  • 'Refresh' → should be in Bengali
  • 'Done' → should be in Bengali

Note: These keys are correctly listed in untranslated.txt (lines 2-8), which confirms they need proper translation.

💡 Suggested Bengali translations

Here are suggested Bengali translations (please verify with a native speaker):

 @override
-String get audioOutput => 'Audio Output';
+String get audioOutput => 'অডিও আউটপুট';

 @override
-String get selectPreferredSpeaker => 'Select your preferred speaker';
+String get selectPreferredSpeaker => 'আপনার পছন্দের স্পিকার নির্বাচন করুন';

 @override
-String get noAudioOutputDevices => 'No audio output devices detected';
+String get noAudioOutputDevices => 'কোনও অডিও আউটপুট ডিভাইস সনাক্ত করা যায়নি';

 @override
-String get refresh => 'Refresh';
+String get refresh => 'রিফ্রেশ করুন';

 @override
-String get done => 'Done';
+String get done => 'সম্পন্ন';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@override
String get audioOutput => 'Audio Output';
@override
String get selectPreferredSpeaker => 'Select your preferred speaker';
@override
String get noAudioOutputDevices => 'No audio output devices detected';
@override
String get refresh => 'Refresh';
@override
String get done => 'Done';
@override
String get audioOutput => 'অডিও আউটপুট';
@override
String get selectPreferredSpeaker => 'আপনার পছন্দের স্পিকার নির্বাচন করুন';
@override
String get noAudioOutputDevices => 'কোনও অডিও আউটপুট ডিভাইস সনাক্ত করা যায়নি';
@override
String get refresh => 'রিফ্রেশ করুন';
@override
String get done => 'সম্পন্ন';
🤖 Prompt for AI Agents
In @lib/l10n/app_localizations_bn.dart around lines 1357 - 1371, Replace the
English strings with Bengali translations for the listed getters: update
audioOutput to 'অডিও আউটপুট', selectPreferredSpeaker to 'আপনার পছন্দসই স্পিকার
নির্বাচন করুন', noAudioOutputDevices to 'কোন অডিও আউটপুট ডিভাইস পাওয়া যায়নি',
refresh to 'রিফ্রেশ' (or 'পুনরায় লোড' if preferred), and done to 'সম্পন্ন' by
editing the return values in the corresponding getters (audioOutput,
selectPreferredSpeaker, noAudioOutputDevices, refresh, done) so the Bengali
localization file no longer contains English strings.

@override
String get deleteMessageTitle => 'বার্তা মুছে ফেলুন';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,21 @@ class AppLocalizationsEn extends AppLocalizations {
String get noRecordingError =>
'You have not recorded anything for the chapter. Please record a chapter before exiting the room';

@override
String get audioOutput => 'Audio Output';

@override
String get selectPreferredSpeaker => 'Select your preferred speaker';

@override
String get noAudioOutputDevices => 'No audio output devices detected';

@override
String get refresh => 'Refresh';

@override
String get done => 'Done';

@override
String get deleteMessageTitle => 'Delete Message';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_gu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,21 @@ class AppLocalizationsGu extends AppLocalizations {
String get noRecordingError =>
'તમે અધ્યાય માટે કઈ પણ રેકોર્ડિંગ નથી કર્યું. રૂમમાંથી બહાર નીકળતા પહેલાં કૃપા કરીને અધ્યાય રેકોર્ડ કરો.';

@override
String get audioOutput => 'Audio Output';

@override
String get selectPreferredSpeaker => 'Select your preferred speaker';

@override
String get noAudioOutputDevices => 'No audio output devices detected';

@override
String get refresh => 'Refresh';

@override
String get done => 'Done';

Comment on lines +1349 to +1363
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Gujarati locale strings are left in English (likely placeholder).

These new getters return English text in the gu localization file; if this isn’t intentional, please provide Gujarati translations (or explicitly fall back to English via ARB/default locale rather than per-locale English strings).

@override
String get deleteMessageTitle => 'સંદેશ કાઢી નાખો';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_hi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1347,6 +1347,21 @@ class AppLocalizationsHi extends AppLocalizations {
String get noRecordingError =>
'आपके पास कोई रिकॉर्डिंग नहीं है। लाइव चैप्टर रूम से बाहर निकलने के लिए, कृपया पहले रिकॉर्डिंग शुरू करें।';

@override
String get audioOutput => 'ऑडियो आउटपुट';

@override
String get selectPreferredSpeaker => 'अपना पसंदीदा स्पीकर चुनें';

@override
String get noAudioOutputDevices => 'कोई ऑडियो आउटपुट डिवाइस नहीं मिला';

@override
String get refresh => 'रीफ़्रेश करें';

@override
String get done => 'हो गया';

@override
String get deleteMessageTitle => 'संदेश हटाएँ';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_kn.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,21 @@ class AppLocalizationsKn extends AppLocalizations {
String get noRecordingError =>
'ನೀವು ಅಧ್ಯಾಯಕ್ಕಾಗಿ ಏನನ್ನೂ ರೆಕಾರ್ಡ್ ಮಾಡಿಲ್ಲ. ದಯವಿಟ್ಟು ರೂಮ್‌ನಿಂದ ನಿರ್ಗಮಿಸುವ ಮೊದಲು ಅಧ್ಯಾಯವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ';

@override
String get audioOutput => 'Audio Output';

@override
String get selectPreferredSpeaker => 'Select your preferred speaker';

@override
String get noAudioOutputDevices => 'No audio output devices detected';

@override
String get refresh => 'Refresh';

@override
String get done => 'Done';

Comment on lines +1356 to +1370
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Missing Kannada translations for new audio output keys.

The five new localization getters return English strings instead of Kannada translations, breaking the localization pattern established throughout the file. All other strings in this file are properly translated to Kannada.

Expected Kannada translations for:

  • audioOutput → ಆಡಿಯೋ ಔಟ್‌ಪುಟ್
  • selectPreferredSpeaker → ನಿಮ್ಮ ಆದ್ಯತೆಯ ಸ್ಪೀಕರ್ ಆಯ್ಕೆಮಾಡಿ
  • noAudioOutputDevices → ಯಾವುದೇ ಆಡಿಯೋ ಔಟ್‌ಪುಟ್ ಸಾಧನಗಳು ಪತ್ತೆಯಾಗಿಲ್ಲ
  • refresh → ರಿಫ್ರೆಶ್
  • done → ಮುಗಿದಿದೆ
🤖 Prompt for AI Agents
In @lib/l10n/app_localizations_kn.dart around lines 1353 - 1367, Replace the
English strings for the five localization getters with the provided Kannada
translations: update the getter audioOutput to 'ಆಡಿಯೋ ಔಟ್‌ಪುಟ್',
selectPreferredSpeaker to 'ನಿಮ್ಮ ಆದ್ಯತೆಯ ಸ್ಪೀಕರ್ ಆಯ್ಕೆಮಾಡಿ',
noAudioOutputDevices to 'ಯಾವುದೇ ಆಡಿಯೋ ಔಟ್‌ಪುಟ್ ಸಾಧನಗಳು ಪತ್ತೆಯಾಗಿಲ್ಲ', refresh to
'ರಿಫ್ರೆಶ್', and done to 'ಮುಗಿದಿದೆ' so the getters audioOutput,
selectPreferredSpeaker, noAudioOutputDevices, refresh, and done return the
correct Kannada text.

@override
String get deleteMessageTitle => 'Delete Message';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_mr.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1344,6 +1344,21 @@ class AppLocalizationsMr extends AppLocalizations {
String get noRecordingError =>
'आपने अध्यायसाठी कोणतेही रेकॉर्डिंग केले नाही. कोठा बंद करण्यापूर्वी कृपया अध्याय रेकॉर्ड करा';

@override
String get audioOutput => 'Audio Output';

@override
String get selectPreferredSpeaker => 'Select your preferred speaker';

@override
String get noAudioOutputDevices => 'No audio output devices detected';

@override
String get refresh => 'Refresh';

@override
String get done => 'Done';

Comment on lines +1350 to +1364
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Marathi locale strings are left in English (likely placeholder).

These new getters return English text in the mr localization file; please translate to Marathi (or intentionally fall back to en rather than embedding English in mr).

🤖 Prompt for AI Agents
In @lib/l10n/app_localizations_mr.dart around lines 1347 - 1361, The Marathi
localization file has several getters still returning English; update the
getters audioOutput, selectPreferredSpeaker, noAudioOutputDevices, refresh, and
done in app_localizations_mr.dart to provide proper Marathi translations (or
explicitly call the English fallback/localized lookup if you intend to fall back
rather than embed English). Ensure each getter returns the correct Marathi
string for "Audio Output", "Select your preferred speaker", "No audio output
devices detected", "Refresh", and "Done" respectively, and keep the getter names
unchanged.

@override
String get deleteMessageTitle => 'संदेश हटवा';

Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_pa.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,21 @@ class AppLocalizationsPa extends AppLocalizations {
String get noRecordingError =>
'ਤੁਸੀਂ ਇਸ ਅਧਿਆਇ ਲਈ ਕੁਝ ਵੀ ਰਿਕਾਰਡ ਨਹੀਂ ਕੀਤਾ। ਕਿਰਪਾ ਕਰਕੇ ਰੂਮ ਬੰਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਰਿਕਾਰਡ ਕਰੋ';

@override
String get audioOutput => 'ਆਡੀਓ ਆਊਟਪੁੱਟ';

@override
String get selectPreferredSpeaker => 'ਆਪਣਾ ਪਸੰਦੀਦਾ ਸਪੀਕਰ ਚੁਣੋ';

@override
String get noAudioOutputDevices => 'ਕੋਈ ਆਡੀਓ ਆਊਟਪੁੱਟ ਡਿਵਾਈਸ ਨਹੀਂ ਮਿਲੀ';

@override
String get refresh => 'ਰਿਫ੍ਰੈਸ਼ ਕਰੋ';

@override
String get done => 'ਹੋ ਗਿਆ';

@override
String get deleteMessageTitle => 'ਸੁਨੇਹਾ ਹਟਾਓ';

Expand Down
Loading