soundpoolを使ってアラーム/音を鳴らす方法 – flutter_riverpod

 

日常生活や仕事の中で、アラームや音を使ってタスクの完了や通知を知らせることは非常に重要です。

例えば、朝の目覚まし時計の音や料理のタイマーのブザーなどは、私たちが効果的に時間を管理し、重要なイベントやデッドラインに対応するのに役立ちます。

そこで、このブログ記事では、Soundpoolという強力なツールを使用して、Flutterアプリでアラームや音を鳴らす方法を紹介します。

Soundpoolは、Flutterアプリ開発における音声再生のためのオーディオエンジンです。

Soundpoolを使うことで、アプリ内でMP3やWAVなどの音声ファイルを再生したり、効果音を鳴らしたりすることが可能になります。さらに、音量やループ再生、再生速度などのパラメータを調整することもできます。

この記事では、以下のようなSoundpoolを使用してアラーム/音を鳴らす基本的な手順を具体的に解説します。

実装方法

以下の2stepで進んでいきます

  • soundpoolをプロジェクトにて使えるようにする
  • コーディングをしていく

soundpoolを使えるようにする

まずはプロジェクト内にてsoundpoolを使えるようにします。

pub.devにてsoundpoolをインストールしてきます

flutter pub add soundpool

次にassets/soundsに流したい音のファイルをセットします。

上記のディレクトリを作成し、その直下に音楽ファイル(sound.mp3)を設置します。

flutter:
  assets:
    - assets/sounds/

コーディングする

実装方針は以下の通りです

  • 『ON』を押下すると効果音が鳴ります
  • 効果音が鳴っている間はメッセージが表示されます
  • 「OFF」を押下すると効果音が止まります

model.dart

await _soundpool.play(_alarmSound, repeat: -1);のように引数に-1を持たせていると無限に効果音がループする仕組みになっています。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:soundpool/soundpool.dart';

final soundsProvider = ChangeNotifierProvider((ref) => SoundsModel());

class SoundsModel extends ChangeNotifier {
  Soundpool _soundpool = Soundpool.fromOptions();
  int? _alarmSoundStreamId;
  late Future<int> _soundId;
  String display = "";

  SoundsModel() {
    loadSounds();
  }

  Future<int> _loadSound() async {
    var asset = await rootBundle.load("assets/sounds/sound.mp3");
    return await _soundpool.load(asset);
  }

  Future<void> playSoundInfinity() async {
    var _alarmSound = await _soundId;
    _alarmSoundStreamId = await _soundpool.play(_alarmSound, repeat: -1);
    display = "音が鳴っている!";
    notifyListeners();
  }

  Future<void> stopSound() async {
    if (_alarmSoundStreamId != null) {
      await _soundpool.stop(_alarmSoundStreamId!);
      display = "";
    }
    notifyListeners();
  }

  void loadSounds() {
    _soundId = _loadSound();
  }
}

view.dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'model.dart';

class Home extends ConsumerWidget {
  const Home({
    super.key,
  });

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final SoundsModel soundsModel = ref.watch(soundsProvider);

    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Text(soundsModel.display),
              ElevatedButton(
                onPressed: () {
                  soundsModel.playSoundInfinity();
                },
                child: Text("O N"),
              ),
              ElevatedButton(
                onPressed: () {
                  soundsModel.stopSound();
                },
                child: Text("OFF"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

「ON」を連続して押下すると制御できていないです。
フラグを持たせておく必要があります。

また、Webではrepeat=-1で効果音がループしますが、iOS, Androidではループしません。
お気をつけてください…

コメント

タイトルとURLをコピーしました