yukendev
@yukendev (手塚 友健)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【swift】AVAudioPlayerDelegateのaudioPlayerDidFinishPlayingが呼ばれない

解決したいこと

AVAudioPlayerDelegateを継承した二つのクラスで全く同じ処理を書いても、片方ではaudioPlayerDidFinishPlayingが正常に呼ばれ、もう片方では呼ばれないということが起きています。よかったら力を貸してください。

①プロジェクトの共通のAVAudioPlayerインスタンスを保持

//AVAudioPlayerを設定
internal var audioPlayer: AVAudioPlayer!

②MusicクラスでAVAudioPlayerDelegateを継承して、audioPlayerDidFinishPlayingを実装したら、しっかりと楽曲の終了を検知できた。

class Music: NSObject, Codable, AVAudioPlayerDelegate {

    var id: String
    var band: PlainBand
    var title: String
    var music: String //楽曲データのURL
    var img: String?
    var imgData: Data?
    var lyrics: String?
    var length: Int //曲の長さ(秒)
    var is_downloaded: Bool //ダウンロードされているかどうか

    //音楽再生処理
    func play() {
        do {
            //audioPlayerの設定
            let data = try Data(contentsOf: URL(string: self.music)!)
            audioPlayer = try AVAudioPlayer(data: data)
            audioPlayer.delegate = self
            //再生処理
            audioPlayer!.prepareToPlay()
            audioPlayer!.play()
        } catch let error as NSError {
            print("Failed to load: \(error.localizedDescription)")
        }
    }
    //楽曲の終了を検知
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("再生終了です") ==> 検知できる
    }
}

③新しく作ったMusicPlayerクラスでAVAudioPlayerDelegateを継承し、audioPlayerDidFinishPlayingを実装したとこと、楽曲の終了が検知できない

class MusicPlayer: NSObject, AVAudioPlayerDelegate {

    var musics: [Music] //再生する音楽の配列を保持

    var count: Int = 0 //現在再生している音楽の番号を保持

    init(musics: [Music]) {
        self.musics = musics
    }

    //音楽再生処理
    func play() {
        do {
            //audioPlayerの設定
            let data = try Data(contentsOf: URL(string: self.musics[count].music)!)
            audioPlayer = try AVAudioPlayer(data: data)
            audioPlayer.delegate = self
            //再生処理
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        } catch let error as NSError {
            print("Failed to load: \(error.localizedDescription)")
        }
    }
    //楽曲の終了を検知
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("再生終了です") ==> 検知できない
    }
}

MusicクラスとMusicPlayerクラスでは全く同じ処理を書いたはずなのに、片方しか正常に動作しません。

もし、よろしければ解決方法をどなたか教えていただけませんでしょうか。

0

No Answers yet.

Your answer might help someone💌