Skip to content

Commit

Permalink
feat: set player (volume, speed, pitch) from within minplayer
Browse files Browse the repository at this point in the history
MSOB7YY committed Sep 10, 2023
1 parent 6a6f279 commit d1da50c
Showing 8 changed files with 169 additions and 1 deletion.
3 changes: 3 additions & 0 deletions assets/language/translations/ar_SA.json
Original file line number Diff line number Diff line change
@@ -51,6 +51,7 @@
"PALETTE_SELECTED_MIX": "Selected Mix",
"PAUSE_PLAYBACK": "Pause playback",
"PINNED": "Pinned",
"PITCH": "Pitch",
"RANDOM_PICKS": "Random Picks",
"RECENTLY_ADDED": "Recently Added",
"RECENT_ALBUMS": "Recent Albums",
@@ -68,6 +69,7 @@
"SHUFFLE_ALL": "Shuffle All",
"SHUFFLE_NEXT": "Shuffle Next",
"SORT_BY": "Sort by",
"SPEED": "Speed",
"SUBSCRIBE": "Subscribe",
"SUBSCRIBED": "Subscribed",
"SUPREMACY": "Supremacy",
@@ -81,5 +83,6 @@
"UPDATE_DIRECTORY_PATH": "Update directory path",
"UPDATE_MISSING_TRACKS_ONLY": "Update missing tracks only",
"USED": "Used",
"VOLUME": "Volume",
"WEEK": "Week"
}
3 changes: 3 additions & 0 deletions assets/language/translations/en_US.json
Original file line number Diff line number Diff line change
@@ -329,6 +329,7 @@
"PERMISSION_UPDATE": "Permission Update",
"PICK_FROM_STORAGE": "Pick from storage",
"PINNED": "Pinned",
"PITCH": "Pitch",
"PLAY": "Play",
"PLAYBACK_SETTING": "Playback",
"PLAYBACK_SETTING_SUBTITLE": "Can be accessed directly in the player by long pressing the audio button",
@@ -430,6 +431,7 @@
"SLEEP_TIMER": "Sleep timer",
"SORT_BY": "Sort by",
"SOURCE": "Source",
"SPEED": "Speed",
"STAGGERED_ALBUM_GRID_VIEW": "Staggered Album Gridview",
"START": "Start",
"STATS": "Statistics",
@@ -514,6 +516,7 @@
"VIDEO_QUALITY_SUBTITLE": "Highest quality available will be picked.",
"VIDEO_QUALITY_SUBTITLE_NOTE": "It's always good to keep more alternatives in case a quality isn't found, otherwise it will fallback to the worst quality",
"VIEW_ALL": "View All",
"VOLUME": "Volume",
"WARNING": "Warning",
"WAVEFORMS": "Waveforms",
"WAVEFORM_BARS_COUNT": "Waveform Bars Count",
12 changes: 12 additions & 0 deletions lib/controller/audio_handler.dart
Original file line number Diff line number Diff line change
@@ -271,6 +271,18 @@ class NamidaAudioVideoHandler extends BaseAudioHandler with QueueManager<Selecta
_totalListenedTimeInSec.value = listenTime ?? 0;
}

Future<void> setPlayerPitch(double value) async {
await _player.setPitch(value);
}

Future<void> setPlayerSpeed(double value) async {
await _player.setSpeed(value);
}

Future<void> setPlayerVolume(double value) async {
await _player.setVolume(value);
}

Future<void> setSkipSilenceEnabled(bool enabled) async => await _player.setSkipSilenceEnabled(enabled);

Future<void> tryRestoringLastPosition(Track trackPre) async {
12 changes: 12 additions & 0 deletions lib/controller/player_controller.dart
Original file line number Diff line number Diff line change
@@ -87,6 +87,18 @@ class Player {
await _audioHandler.setSkipSilenceEnabled(enabled);
}

Future<void> setPlayerPitch(double value) async {
await _audioHandler.setPlayerPitch(value);
}

Future<void> setPlayerSpeed(double value) async {
await _audioHandler.setPlayerSpeed(value);
}

Future<void> setPlayerVolume(double value) async {
await _audioHandler.setPlayerVolume(value);
}

void refreshRxVariables() {
_audioHandler.refreshRxVariables();
}
14 changes: 14 additions & 0 deletions lib/controller/settings_controller.dart
Original file line number Diff line number Diff line change
@@ -104,6 +104,8 @@ class SettingsController {
final RxInt isTrackPlayedPercentageCount = 40.obs;
final RxInt waveformTotalBars = 140.obs;
final RxDouble playerVolume = 1.0.obs;
final RxDouble playerSpeed = 1.0.obs;
final RxDouble playerPitch = 1.0.obs;
final RxInt seekDurationInSeconds = 5.obs;
final RxInt seekDurationInPercentage = 2.obs;
final RxBool isSeekDurationPercentage = false.obs;
@@ -296,6 +298,8 @@ class SettingsController {
isTrackPlayedPercentageCount.value = json['isTrackPlayedPercentageCount'] ?? isTrackPlayedPercentageCount.value;
waveformTotalBars.value = json['waveformTotalBars'] ?? waveformTotalBars.value;
playerVolume.value = json['playerVolume'] ?? playerVolume.value;
playerSpeed.value = json['playerSpeed'] ?? playerSpeed.value;
playerPitch.value = json['playerPitch'] ?? playerPitch.value;
seekDurationInSeconds.value = json['seekDurationInSeconds'] ?? seekDurationInSeconds.value;
seekDurationInPercentage.value = json['seekDurationInPercentage'] ?? seekDurationInPercentage.value;
isSeekDurationPercentage.value = json['isSeekDurationPercentage'] ?? isSeekDurationPercentage.value;
@@ -465,6 +469,8 @@ class SettingsController {
'isTrackPlayedPercentageCount': isTrackPlayedPercentageCount.value,
'waveformTotalBars': waveformTotalBars.value,
'playerVolume': playerVolume.value,
'playerSpeed': playerSpeed.value,
'playerPitch': playerPitch.value,
'seekDurationInSeconds': seekDurationInSeconds.value,
'seekDurationInPercentage': seekDurationInPercentage.value,
'isSeekDurationPercentage': isSeekDurationPercentage.value,
@@ -605,6 +611,8 @@ class SettingsController {
bool? playerInfiniyQueueOnNextPrevious,
int? waveformTotalBars,
double? playerVolume,
double? playerSpeed,
double? playerPitch,
int? seekDurationInSeconds,
int? seekDurationInPercentage,
bool? isSeekDurationPercentage,
@@ -915,6 +923,12 @@ class SettingsController {
if (playerVolume != null) {
this.playerVolume.value = playerVolume;
}
if (playerSpeed != null) {
this.playerSpeed.value = playerSpeed;
}
if (playerPitch != null) {
this.playerPitch.value = playerPitch;
}
if (seekDurationInSeconds != null) {
this.seekDurationInSeconds.value = seekDurationInSeconds;
}
3 changes: 3 additions & 0 deletions lib/core/translations/keys.dart
Original file line number Diff line number Diff line change
@@ -332,6 +332,7 @@ class LanguageKeys {
late String PERMISSION_UPDATE;
late String PICK_FROM_STORAGE;
late String PINNED;
late String PITCH;
late String PLAY_AFTER_NEXT_PREV;
late String PLAY_AFTER;
late String PLAY_ALL;
@@ -433,6 +434,7 @@ class LanguageKeys {
late String SLEEP_TIMER;
late String SORT_BY;
late String SOURCE;
late String SPEED;
late String STAGGERED_ALBUM_GRID_VIEW;
late String START;
late String STATS_SUBTITLE;
@@ -517,6 +519,7 @@ class LanguageKeys {
late String VIDEO_QUALITY;
late String VIDEO;
late String VIEW_ALL;
late String VOLUME;
late String WARNING;
late String WAVEFORM_BARS_COUNT;
late String WAVEFORMS;
6 changes: 6 additions & 0 deletions lib/core/translations/language.dart
Original file line number Diff line number Diff line change
@@ -399,6 +399,7 @@ class Language extends LanguageKeys {
PERMISSION_UPDATE = getKey("PERMISSION_UPDATE");
PICK_FROM_STORAGE = getKey("PICK_FROM_STORAGE");
PINNED = getKey("PINNED");
PITCH = getKey("PITCH");
PLAY_AFTER_NEXT_PREV = getKey("PLAY_AFTER_NEXT_PREV");
PLAY_AFTER = getKey("PLAY_AFTER");
PLAY_ALL = getKey("PLAY_ALL");
@@ -500,6 +501,7 @@ class Language extends LanguageKeys {
SLEEP_TIMER = getKey("SLEEP_TIMER");
SORT_BY = getKey("SORT_BY");
SOURCE = getKey("SOURCE");
SPEED = getKey("SPEED");
STAGGERED_ALBUM_GRID_VIEW = getKey("STAGGERED_ALBUM_GRID_VIEW");
START = getKey("START");
STATS_SUBTITLE = getKey("STATS_SUBTITLE");
@@ -584,6 +586,7 @@ class Language extends LanguageKeys {
VIDEO_QUALITY = getKey("VIDEO_QUALITY");
VIDEO = getKey("VIDEO");
VIEW_ALL = getKey("VIEW_ALL");
VOLUME = getKey("VOLUME");
WARNING = getKey("WARNING");
WAVEFORM_BARS_COUNT = getKey("WAVEFORM_BARS_COUNT");
WAVEFORMS = getKey("WAVEFORMS");
@@ -611,3 +614,6 @@ class Language extends LanguageKeys {






117 changes: 116 additions & 1 deletion lib/packages/miniplayer.dart
Original file line number Diff line number Diff line change
@@ -789,7 +789,122 @@ class NamidaMiniPlayer extends StatelessWidget {
color: context.theme.colorScheme.secondaryContainer,
shape: BoxShape.circle,
),
child: Icon(videoPlaybackEnabled ? Broken.video : Broken.video_slash, size: 18.0, color: onSecondary),
child: NamidaIconButton(
horizontalPadding: 0.0,
onPressed: () {
String toPercentage(double val) => "${(val * 100).toStringAsFixed(0)}%";

Widget getTextWidget(IconData icon, String title, double value) {
return Row(
children: [
Icon(icon, color: context.defaultIconColor()),
const SizedBox(width: 12.0),
Text(
title,
style: context.textTheme.displayLarge,
),
const SizedBox(width: 8.0),
Text(
toPercentage(value),
style: context.textTheme.displayMedium,
)
],
);
}

Widget getSlider({
double min = 0.0,
double max = 2.0,
required double value,
required void Function(double newValue)? onChanged,
}) {
return Slider.adaptive(
min: min,
max: max,
value: value.clamp(min, max),
onChanged: onChanged,
divisions: 100,
label: "${(value * 100).toStringAsFixed(0)}%",
);
}

NamidaNavigator.inst.navigateDialog(
dialog: CustomBlurryDialog(
title: lang.CONFIGURE,
actions: [
NamidaIconButton(
icon: Broken.refresh,
onPressed: () {
const val = 1.0;
Player.inst.setPlayerPitch(val);
Player.inst.setPlayerSpeed(val);
Player.inst.setPlayerVolume(val);
settings.save(
playerPitch: val,
playerSpeed: val,
playerVolume: val,
);
},
),
NamidaButton(
text: lang.DONE,
onPressed: () {
NamidaNavigator.inst.closeDialog();
},
)
],
child: ListView(
padding: const EdgeInsets.all(12.0),
shrinkWrap: true,
children: [
Obx(() => getTextWidget(Broken.airpods, lang.PITCH, settings.playerPitch.value)),
Obx(
() => getSlider(
value: settings.playerPitch.value,
onChanged: (value) {
Player.inst.setPlayerPitch(value);
settings.save(playerPitch: value);
},
),
),
const SizedBox(height: 12.0),
Obx(
() => getTextWidget(Broken.forward, lang.SPEED, settings.playerSpeed.value),
),
Obx(
() => getSlider(
value: settings.playerSpeed.value,
onChanged: (value) {
Player.inst.setPlayerSpeed(value);
settings.save(playerSpeed: value);
},
),
),
const SizedBox(height: 12.0),
Obx(
() => getTextWidget(settings.playerVolume.value > 0 ? Broken.volume_high : Broken.volume_slash, lang.VOLUME,
settings.playerVolume.value),
),
Obx(
() => getSlider(
max: 1.0,
value: settings.playerVolume.value,
onChanged: (value) {
Player.inst.setPlayerVolume(value);
settings.save(playerVolume: value);
},
),
),
const SizedBox(height: 12.0),
],
),
),
);
},
icon: videoPlaybackEnabled ? Broken.video : Broken.music_play,
iconSize: 18.0,
iconColor: onSecondary,
),
),
const SizedBox(
width: 8.0,

0 comments on commit d1da50c

Please sign in to comment.