Skip to content

Commit

Permalink
Add option to start alarm at random position
Browse files Browse the repository at this point in the history
  • Loading branch information
AhsanSarwar45 committed Sep 8, 2024
1 parent 9f45356 commit 65c234d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 17 deletions.
22 changes: 15 additions & 7 deletions lib/alarm/data/alarm_settings_schema.dart
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,14 @@ SettingGroup alarmSettingsSchema = SettingGroup(
],
// shouldCloseOnSelect: false,
),
SelectSetting<AndroidAudioUsage>(
"Audio Channel",
(context) => AppLocalizations.of(context)!.audioChannelSetting,
audioChannelOptions,
onChange: (context, index) {
RingtonePlayer.stop();
},
SwitchSetting(
"start_melody_at_random_pos",
(context) => AppLocalizations.of(context)!.startMelodyAtRandomPos,
false,
getDescription: (context) => AppLocalizations.of(context)!.startMelodyAtRandomPosDescription,

),

SliderSetting(
"Volume",
(context) => AppLocalizations.of(context)!.volumeSetting,
Expand Down Expand Up @@ -234,6 +234,14 @@ SettingGroup alarmSettingsSchema = SettingGroup(
enableConditions: [
ValueCondition(["Rising Volume"], (value) => value == true)
]),
SelectSetting<AndroidAudioUsage>(
"Audio Channel",
(context) => AppLocalizations.of(context)!.audioChannelSetting,
audioChannelOptions,
onChange: (context, index) {
RingtonePlayer.stop();
},
),
],
),
SwitchSetting("Vibration",
Expand Down
2 changes: 1 addition & 1 deletion lib/alarm/logic/schedule_alarm.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Future<void> scheduleAlarm(
},
);

logger.i('Scheduled alarm $scheduleId for $startDate of type ${type.name}: $description');
logger.i('Scheduled alarm $scheduleId for $startDate of type ${type.name}: $description');
}
}

Expand Down
1 change: 1 addition & 0 deletions lib/alarm/types/alarm.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ class Alarm extends CustomizableListItem {
String get label => _settings.getSetting("Label").value;
Type get scheduleType => _settings.getSetting("Type").value;
FileItem get ringtone => _settings.getSetting("Melody").value;
bool get shouldStartMelodyAtRandomPos => _settings.getSetting("start_melody_at_random_pos").value;
bool get vibrate => _settings.getSetting("Vibration").value;
double get volume => _settings.getSetting("Volume").value;
double get volumeDuringTasks => _settings.getSetting("task_volume").value;
Expand Down
37 changes: 28 additions & 9 deletions lib/audio/types/ringtone_player.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math';

import 'package:audio_session/audio_session.dart';
import 'package:clock_app/alarm/types/alarm.dart';
import 'package:clock_app/audio/types/ringtone_manager.dart';
Expand All @@ -6,12 +8,15 @@ import 'package:clock_app/timer/types/timer.dart';
import 'package:just_audio/just_audio.dart';
import 'package:vibration/vibration.dart';

Random random = Random();

class RingtonePlayer {
static AudioPlayer? _alarmPlayer;
static AudioPlayer? _timerPlayer;
static AudioPlayer? _mediaPlayer;
static AudioPlayer? activePlayer;
static bool _vibratorIsAvailable = false;
static bool _stopRisingVolume = false;

static Future<void> initialize() async {
_alarmPlayer ??= AudioPlayer(handleInterruptions: true);
Expand Down Expand Up @@ -73,13 +78,12 @@ class RingtonePlayer {
// .uri;
// }
// }
await _play(
uri,
vibrate: alarm.vibrate,
loopMode: LoopMode.one,
volume: alarm.volume / 100,
secondsToMaxVolume: alarm.risingVolumeDuration.inSeconds,
);
await _play(uri,
vibrate: alarm.vibrate,
loopMode: LoopMode.one,
volume: alarm.volume / 100,
secondsToMaxVolume: alarm.risingVolumeDuration.inSeconds,
startAtRandomPos: alarm.shouldStartMelodyAtRandomPos);
}

static Future<void> playTimer(ClockTimer timer,
Expand All @@ -100,6 +104,7 @@ class RingtonePlayer {

static Future<void> setVolume(double volume) async {
logger.t("Setting volume to $volume");
_stopRisingVolume = true;
await activePlayer?.setVolume(volume);
}

Expand All @@ -109,16 +114,27 @@ class RingtonePlayer {
LoopMode loopMode = LoopMode.one,
double volume = 1.0,
int secondsToMaxVolume = 0,
bool startAtRandomPos = false,
// double duration = double.infinity,
}) async {
_stopRisingVolume = false;

RingtoneManager.lastPlayedRingtoneUri = ringtoneUri;
if (_vibratorIsAvailable && vibrate) {
Vibration.vibrate(pattern: [500, 1000], repeat: 0);
}
// activePlayer?.
await activePlayer?.stop();
await activePlayer?.setLoopMode(loopMode);
await activePlayer?.setAudioSource(AudioSource.uri(Uri.parse(ringtoneUri)));
Duration? duration = await activePlayer
?.setAudioSource(AudioSource.uri(Uri.parse(ringtoneUri)));
logger.t("Duration: $duration");

if (duration != null && startAtRandomPos) {
double randomNumber = random.nextInt(100) / 100.0;
logger.t("Starting at random position: $randomNumber");
activePlayer?.seek(duration * randomNumber);
}
await setVolume(volume);

// Gradually increase the volume
Expand All @@ -127,7 +143,9 @@ class RingtonePlayer {
Future.delayed(
Duration(milliseconds: i * (secondsToMaxVolume * 100)),
() {
setVolume((i / 10) * volume);
if (!_stopRisingVolume) {
setVolume((i / 10) * volume);
}
},
);
}
Expand Down Expand Up @@ -158,5 +176,6 @@ class RingtonePlayer {
await Vibration.cancel();
}
RingtoneManager.lastPlayedRingtoneUri = "";
_stopRisingVolume = false;
}
}
4 changes: 4 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,10 @@
"@settingGroupMore": {},
"melodySetting": "Melody",
"@melodySetting": {},
"startMelodyAtRandomPos": "Random position",
"@startMelodyAtRandomPos": {},
"startMelodyAtRandomPosDescription": "Melody will start at a random position",
"@startMelodyAtRandomPosDescription": {},
"vibrationSetting": "Vibration",
"@vibrationSetting": {},
"audioChannelSetting": "Audio Channel",
Expand Down

0 comments on commit 65c234d

Please sign in to comment.