ios - 在 Swift 中延迟排序声音

标签 ios iphone xcode swift audio

很抱歉,如果之前已发布过此内容,但我在搜索此主题时运气不佳。我正在尝试使用 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()
            }
        }
    }
}

这是解决这个问题的正确方法吗?有没有另一种方法可以让我在循环期间连接音频文件(在哔哔声之间放置小间隙),然后在循环完成后播放整个文件?提前感谢您的帮助。

最佳答案

这似乎是一个使用 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
    }
  }
}

enter image description here

关于ios - 在 Swift 中延迟排序声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33312520/

相关文章:

ios - 如何重置导航 View Controller ios swift

javascript - iOS webview 自动对焦在键盘打开时不起作用

iphone - 如何在Objective-C中更改CAShapeLayer相交部分的颜色?

iphone - 支持 IOS SDK 5 的 Facebook API

xcode - 编译失败的 Storyboard

ios - 禁止 subview 上的 viewDidload

带有用于切换的容器 View 的 iOS Swift 分段控件 - View 不是第一次加载

iPhone 在文字游戏中引用我自己的单词列表

swift - 验证按钮单击并更改 Controller View iOS

xcode - 使用其他人的开发者证书签署 iOS 应用程序