<commit_before>// Copyright 2015 <NAME>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package internal

var audioEnabled = false

const SampleRate = 44100

type channel struct {
	l                     []int16
	r                     []int16
	nextInsertionPosition int
}

var MaxChannel = 32

var channels = make([]*channel, MaxChannel)

func init() {
	for i, _ := range channels {
		channels[i] = &channel{
			l: []int16{},
			r: []int16{},
		}
	}
}

func Init() {
	initialize()
	start()
}

func isPlaying(channel int) bool {
	ch := channels[channel]
	return ch.nextInsertionPosition < len(ch.l)
}

func channelAt(i int) *channel {
	if i == -1 {
		for i, _ := range channels {
			if !isPlaying(i) {
				return channels[i]
			}
		}
		return nil
	}
	if !isPlaying(i) {
		return channels[i]
	}
	return nil
}

func Play(channel int, l []int16, r []int16) bool {
	result := false
	withChannels(func() {
		if !audioEnabled {
			return
		}

		if len(l) != len(r) {
			panic("len(l) must equal to len(r)")
		}
		ch := channelAt(channel)
		if ch == nil {
			return
		}
		ch.l = append(ch.l, make([]int16, ch.nextInsertionPosition-len(ch.l))...)
		ch.r = append(ch.r, make([]int16, ch.nextInsertionPosition-len(ch.r))...)
		ch.l = append(ch.l, l...)
		ch.r = append(ch.r, r...)
		result = true
	})
	return result
}

func Queue(channel int, l []int16, r []int16) {
	withChannels(func() {
		if !audioEnabled {
			return
		}

		if len(l) != len(r) {
			panic("len(l) must equal to len(r)")
		}
		ch := channels[channel]
		ch.l = append(ch.l, l...)
		ch.r = append(ch.r, r...)
	})
}

func Tick() {
	for _, ch := range channels {
		ch.nextInsertionPosition += SampleRate / 60
	}
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func isChannelsEmpty() bool {
	result := false
	withChannels(func() {
		if !audioEnabled {
			result = true
			return
		}

		for _, ch := range channels {
			if 0 < len(ch.l) {
				return
			}
		}
		result = true
		return
	})
	return result
}

func loadChannelBuffer(channel int, bufferSize int) (l, r []int16) {
	withChannels(func() {
		if !audioEnabled {
			return
		}

		ch := channels[channel]
		length := min(len(ch.l), bufferSize)
		inputL := ch.l[:length]
		inputR := ch.r[:length]
		ch.l = ch.l[length:]
		ch.r = ch.r[length:]
		ch.nextInsertionPosition -= min(bufferSize, ch.nextInsertionPosition)
		l, r = inputL, inputR
	})
	return
}

func IsPlaying(channel int) bool {
	result := false
	withChannels(func() {
		if !audioEnabled {
			return
		}
		result = isPlaying(channel)
	})
	return result
}<commit_msg>#128 Bug fix: Delay when playing audio<commit_after>// Copyright 2015 <NAME>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package internal

var audioEnabled = false

const SampleRate = 44100

type channel struct {
	l                     []int16
	r                     []int16
	nextInsertionPosition int
}

var MaxChannel = 32

var channels = make([]*channel, MaxChannel)

func init() {
	for i, _ := range channels {
		channels[i] = &channel{
			l: []int16{},
			r: []int16{},
		}
	}
}

func Init() {
	initialize()
	start()
}

func isPlaying(channel int) bool {
	ch := channels[channel]
	return ch.nextInsertionPosition < len(ch.l)
}

func channelAt(i int) *channel {
	var ch *channel
	withChannels(func() {
		if i == -1 {
			for i, _ := range channels {
				if !isPlaying(i) {
					ch = channels[i]
					return
				}
			}
			return
		}
		if !isPlaying(i) {
			ch = channels[i]
			return
		}
		return
	})
	return ch
}

func Play(channel int, l []int16, r []int16) bool {
	ch := channelAt(channel)
	if ch == nil {
		return false
	}
	withChannels(func() {
		if !audioEnabled {
			return
		}
		if len(l) != len(r) {
			panic("len(l) must equal to len(r)")
		}
		d := ch.nextInsertionPosition - len(l)
		if 0 < d {
			ch.l = append(ch.l, make([]int16, d)...)
			ch.r = append(ch.r, make([]int16, d)...)
		}
		ch.l = append(ch.l, l...)
		ch.r = append(ch.r, r...)
	})
	return true
}

func Queue(channel int, l []int16, r []int16) {
	withChannels(func() {
		if !audioEnabled {
			return
		}
		if len(l) != len(r) {
			panic("len(l) must equal to len(r)")
		}
		ch := channels[channel]
		ch.l = append(ch.l, l...)
		ch.r = append(ch.r, r...)
	})
}

func Tick() {
	for _, ch := range channels {
		if 0 < len(ch.l) {
			ch.nextInsertionPosition += SampleRate / 60 // FPS
		} else {
			ch.nextInsertionPosition = 0
		}
	}
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func isChannelsEmpty() bool {
	result := false
	withChannels(func() {
		if !audioEnabled {
			result = true
			return
		}

		for _, ch := range channels {
			if 0 < len(ch.l) {
				return
			}
		}
		result = true
		return
	})
	return result
}

func loadChannelBuffer(channel int, bufferSize int) (l, r []int16) {
	withChannels(func() {
		if !audioEnabled {
			return
		}

		ch := channels[channel]
		length := min(len(ch.l), bufferSize)
		inputL := ch.l[:length]
		inputR := ch.r[:length]
		ch.nextInsertionPosition -= length
		if ch.nextInsertionPosition < 0 {
			ch.nextInsertionPosition = 0
		}
		ch.l = ch.l[length:]
		ch.r = ch.r[length:]
		l, r = inputL, inputR
	})
	return
}

func IsPlaying(channel int) bool {
	result := false
	withChannels(func() {
		if !audioEnabled {
			return
		}
		result = isPlaying(channel)
	})
	return result
}
{'fraction_non_alphanumeric': 0.14278907242693775, 'fraction_numerical': 0.014294790343074968, 'mean_word_length': 2.820995145631068, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, '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': '488827', 'n_tokens_mistral': 2526, 'n_tokens_neox': 2253, 'n_words': 664}