【问题标题】:finished playing audio callback with finch完成用 finch 播放音频回调
【发布时间】:2012-02-23 03:43:41
【问题描述】:

finch 是否有完成播放回调?类似于 - audioPlayerDidFinishPlaying 在 avaudioplayer 的东西?浏览代码我找不到任何引用它的东西。

【问题讨论】:

    标签: iphone audio finch


    【解决方案1】:

    Finch 中没有这样的回调,因为 OpenAL 不支持。 (或者至少我上次看时它不支持它。)你可以这样伪造它:

    - (void) playSoundWithCallback {
        [someSound play];
        [someDelegate performSelector:@selector(soundDidFinishPlaying:)
            withObject:someSound afterDelay:someSound.duration];
    }
    

    我没有尝试过,但它是一个简单的代码,应该可以正常工作。好吧……至少在你开始弄乱音高和音速之前:)

    【讨论】:

    • 我还没有深入研究 Finch/OpenAL,但可能有一种方法可以轮询以查看是否正在播放声音?这会稍微复杂一些,但即使音高发生变化也可以工作。
    【解决方案2】:

    @zoul:我知道这是一个很晚的回复。但我注意到答案不正确。如果我暂停声音或系统中断怎么办。在这种情况下,即使声音尚未完成,您也会收到回调。请阅读 openAL 规范中的“4.3.6.管理源代码执行”段落以进行正确处理。

    【讨论】:

      【解决方案3】:

      如果您不关心中断,这里有一个带有音高修复的技巧。

      OpenAL 改变音高不是 1.0 时播放声音的播放长度。 (似乎无法从 OpenAL 查询这个新长度, 因为 AL 参数返回与以前相同的值)

      音高范围从 0.5 到 2.0f。所以,如果我们假设 0.5 的音高正好是两倍长, 而 2.0 的音高正好是其长度的一半,我们应该能够将音高用作倍数:

      - (void) playSoundWithCallback {
          [someSound play]; 
          [someDelegate performSelector:@selector(soundDidFinishPlaying:) 
              withObject:someSound afterDelay: someSound.duration * (1.0/someSound.pitch) ]; 
      } 
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多