<commit_before>//
//  HKLAVGaplessPlayer.swift
//
//  Created by <NAME> on 2014/12/22.
//  Copyright (c) 2014年 <NAME>. All rights reserved.
//

import Foundation
import CoreMedia
import AVFoundation

/**
:class: HKLAVGaplessPlayer
:abstract:
アセットおよびそのアセットリーダーを保持していて、外部からのリクエストにより
非同期でサンプルバッファを生成する
*/
class HKLAVGaplessPlayer: NSObject {
    weak var playerView: HKLGLPixelBufferView! = nil

    /**
    アセットを内部キューの末尾に追加する

    :param: asset 再生対象となるアセット
    */
    func appendAsset(asset: AVAsset) {
        if displayLink == nil {
            // DisplayLinkを作成
            displayLink = CADisplayLink(target: self, selector: "displayLinkCallback:")
            displayLink.frameInterval = 60 / kFrameRate
            displayLink.paused = true
            dispatch_sync(dispatch_get_main_queue()) {
                self.displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            }
        }

        _producer.appendAsset(asset)
    }

    /**
    現在位置からプレーヤーを再生
    */
    func play() {
        if displayLink.paused == true {
            _producer.startReading()
            _lastTimestamp = CACurrentMediaTime()
            _remainingPresentationTime = 0.0
        }
        displayLink.paused = false
    }
    /**
    再生の一時停止。再開可能
    */
    func pause() {
        displayLink.paused = true
        _lastTimestamp = CACurrentMediaTime()
        _remainingPresentationTime = 0.0
    }<commit_msg>Fix a stall when appendAsset() is called on main thread.<commit_after>//
//  HKLAVGaplessPlayer.swift
//
//  Created by <NAME> on 2014/12/22.
//  Copyright (c) 2014年 <NAME>. All rights reserved.
//

import Foundation
import CoreMedia
import AVFoundation

/**
:class: HKLAVGaplessPlayer
:abstract:
アセットおよびそのアセットリーダーを保持していて、外部からのリクエストにより
非同期でサンプルバッファを生成する
*/
class HKLAVGaplessPlayer: NSObject {
    weak var playerView: HKLGLPixelBufferView! = nil

    /**
    アセットを内部キューの末尾に追加する

    :param: asset 再生対象となるアセット
    */
    func appendAsset(asset: AVAsset) {
        if displayLink == nil {
            // DisplayLinkを作成
            displayLink = CADisplayLink(target: self, selector: "displayLinkCallback:")
            displayLink.frameInterval = 60 / kFrameRate
            displayLink.paused = true
            dispatch_async(dispatch_get_main_queue()) {
                self.displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            }
        }

        _producer.appendAsset(asset)
    }

    /**
    現在位置からプレーヤーを再生
    */
    func play() {
        if displayLink.paused == true {
            _producer.startReading()
            _lastTimestamp = CACurrentMediaTime()
            _remainingPresentationTime = 0.0
        }
        displayLink.paused = false
    }
    /**
    再生の一時停止。再開可能
    */
    func pause() {
        displayLink.paused = true
        _lastTimestamp = CACurrentMediaTime()
        _remainingPresentationTime = 0.0
    }
{'fraction_non_alphanumeric': 0.09212328767123287, 'fraction_numerical': 0.012328767123287671, 'mean_word_length': 2.323094425483504, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3520843', 'n_tokens_mistral': 1077, 'n_tokens_neox': 992, 'n_words': 171}