道歉,如果之前已发布,但我没有太多运气搜索这个主题。我正在尝试使用Swift构建一个莫尔斯代码转换器。作为其中的一部分,我已经创建了一个接受一串点和破折号的函数,并希望播放相应的音频。我已经成功装载了2个音频播放器,用于短促和长音。
我开始循环播放字符串并为每个字符播放相应的声音。然而,这只是平行播放所有声音。现在我正在尝试使用dispatch_after,但仍然遇到同样的问题。我的代码如下。
func audioMorseMessage(message: String) {
var time = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC))
for character in message.characters {
if String(character) == "-" {
dispatch_after(time,dispatch_get_main_queue()){
self.longBeep.play()
}
}
if String(character) == "." {
dispatch_after(time,dispatch_get_main_queue()){
self.shortBeep.play()
}
}
}
}
这是解决这个问题的正确方法吗?是否有另一种方法可以在循环期间连接音频文件(在蜂鸣声之间放置小间隙),然后在循环完成后播放整个文件?感谢您提前提供任何帮助。
答案 0 :(得分:2)
这似乎是使用NSOperation和NSOperationQueue的绝佳机会。我建议创建一个串行队列,然后按顺序加载各个声音操作。以下代码尚未完全形成,但非常接近。希望你的点和声音文件在每个音调后都包含点延长的空间。如果他们没有,那么你将不得不自己插入额外的空格(暂停)。
class LongBeep: NSOperation {
override func main() {
if self.cancelled { return }
print("L", terminator: "") // play long sound
}
}
class ShortBeep: NSOperation {
override func main() {
if self.cancelled { return }
print("S", terminator: "") // play short sound
}
}
class Pause: NSOperation {
override func main() {
if self.cancelled { return }
print(" pause ", terminator: "") // play empty sound or use actual delay
}
}
func audioMorseMessage(message: String) {
let queue = NSOperationQueue()
queue.name = "morse-player"
queue.maxConcurrentOperationCount = 1
message.characters.map{code in
switch code {
case "-": queue.addOperation(LongBeep())
case ".": queue.addOperation(ShortBeep())
case " ": queue.addOperation(Pause())
default: break
}
}
}