         } else if let file = file {
             playerNode.scheduleFile(file,
                                     at: when,
-                                    completionCallbackType: .dataPlayedBack) { _ in
+                                    completionCallbackType: completionCallbackType) { _ in
                 self.internalCompletionHandler()
             }
             scheduleTime = when ?? AVAudioTime.now()

    /// or the player will call it when play() is called to load the audio data
    /// - Parameters:
    ///   - when: What time to schedule for
    public func schedule(at when: AVAudioTime? = nil) {
        if isBuffered, let buffer = buffer {
            playerNode.scheduleBuffer(buffer,
                                      at: nil,
                                      options: bufferOptions,
                                      completionCallbackType: .dataPlayedBack) { _ in
                self.internalCompletionHandler()
            }
            scheduleTime = when ?? AVAudioTime.now()

    /// - Parameters:
    ///   - when: What time to schedule for. A value of nil means now or will
    ///   use a pre-existing scheduled time.
    ///   - completionCallbackType: Constants that specify when the completion handler must be invoked.
    public func play(at when: AVAudioTime? = nil, completionCallbackType: AVAudioPlayerNodeCompletionCallbackType = .dataPlayedBack) {
        guard !isPlaying || isPaused else { return }

        guard playerNode.engine != nil else {
