Skip to content

Commit

Permalink
Merge pull request #56 from sezanzeb/events-taskqueue
Browse files Browse the repository at this point in the history
Using GLib events instead of callbacks, fixed recursion problems
  • Loading branch information
kassoulet authored Dec 3, 2021
2 parents abe6b86 + 94bc751 commit 8c305c3
Show file tree
Hide file tree
Showing 311 changed files with 149 additions and 73 deletions.
Empty file modified bin/soundconverter
100755 → 100644
Empty file.
26 changes: 15 additions & 11 deletions soundconverter/gstreamer/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,6 @@ def __init__(self, sound_file, name_generator):
self.newname = None
self.existing_behaviour = Converter.INCREMENT
self.name_generator = name_generator
self.callback = lambda: None

# All relevant gio settings have to be copied and remembered, so that
# they don't suddenly change during the conversion
Expand All @@ -236,10 +235,12 @@ def __init__(self, sound_file, name_generator):
# State
self.command = None
self.pipeline = None
self.done = False
self._done = False
self.error = None
self.output_uri = None

super().__init__()

def _query_position(self):
"""Ask for the stream position of the current pipeline."""
if self.pipeline:
Expand All @@ -253,7 +254,7 @@ def get_progress(self):
"""Fraction of how much of the task is completed."""
duration = self.sound_file.duration

if self.done:
if self._done:
return 1, duration

if self.pipeline is None or duration is None:
Expand All @@ -267,7 +268,7 @@ def get_progress(self):
def cancel(self):
"""Cancel execution of the task."""
self._stop_pipeline()
self.callback()
self.done()

def pause(self):
"""Pause execution of the task."""
Expand Down Expand Up @@ -352,14 +353,14 @@ def _conversion_done(self):
beautify_uri(input_uri),
self.error
))
self.callback()
self.done()
return

if not vfs_exists(self.temporary_filename):
self.error = 'Expected {} to exist after conversion.'.format(
self.temporary_filename
)
self.callback()
self.done()
return

# rename temporary file
Expand Down Expand Up @@ -398,7 +399,7 @@ def _conversion_done(self):
beautify_uri(newname),
str(error)
))
self.callback()
self.done()
return

assert vfs_exists(newname)
Expand Down Expand Up @@ -448,9 +449,12 @@ def _conversion_done(self):
))

self.output_uri = newname
self.done = True
self.callback()
self.done()

def done(self):
self._done = True
self._cleanup()
super().done()

def run(self):
"""Call this in order to run the whole Converter task."""
Expand All @@ -469,7 +473,7 @@ def run(self):
logger.info('output file already exists, skipping \'{}\''.format(
beautify_uri(self.newname)
))
self._conversion_done()
self.done()
return

# construct a pipeline for conversion
Expand Down Expand Up @@ -530,7 +534,7 @@ def _on_error(self, error):
beautify_uri(self.sound_file.uri)
)
self._stop_pipeline()
self.callback()
self.done()

def _on_message(self, _, message):
"""Handle message events sent by gstreamer.
Expand Down
6 changes: 4 additions & 2 deletions soundconverter/gstreamer/discoverer.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,14 +185,16 @@ def __init__(self, sound_files):
self.bus = None
self.thread = None

super().__init__()

def get_progress(self):
"""Fraction of how much of the task is completed."""
return self.discovered / len(self.sound_files), 1

def cancel(self):
"""Cancel execution of the task."""
# fast task, use case doesn't exist
self.callback()
self.done()

def pause(self):
"""Pause execution of the task."""
Expand All @@ -216,6 +218,6 @@ def _on_message(self, _, message):
"""Write down that it is finished and call the callback."""
if message.type == Gst.MessageType.EOS:
self.running = False
self.callback()
self.done()
else:
self.discovered += 1
24 changes: 15 additions & 9 deletions soundconverter/interface/batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
from soundconverter.util.fileoperations import filename_to_uri, beautify_uri
from soundconverter.util.logger import logger
from soundconverter.util.formatting import format_time
from soundconverter.interface.mainloop import gtk_iteration

cli_convert = [None]

Expand Down Expand Up @@ -364,19 +365,24 @@ def __init__(self, input_files):
len(sound_files)
))
self.conversions = conversions

def finished(_=None):
total_time = conversions.get_duration()
logger.info('converted {} files in {}'.format(
len(sound_files),
format_time(total_time)
))

conversions.connect('done', finished)

conversions.run()
while conversions.running:

while not conversions.finished:
# make the eventloop of glibs async stuff run until finished:
context.iteration(True)
context.iteration(may_block=True)

# do another one to print the queue done message
context.iteration(True)

total_time = conversions.get_duration()
logger.info('converted {} files in {}'.format(
len(sound_files),
format_time(total_time)
))
context.iteration(may_block=False)


class CLICheck:
Expand Down
2 changes: 1 addition & 1 deletion soundconverter/interface/filelist.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def add_uris(self, uris, base=None, extensions=None):

add_discoverers(self.discoverers, sound_files)

self.discoverers.set_on_queue_finished(self.discoverer_queue_ended)
self.discoverers.connect('done', self.discoverer_queue_ended)
self.discoverers.run()

self.window.set_status('{}'.format(_('Adding Files…')))
Expand Down
8 changes: 4 additions & 4 deletions soundconverter/interface/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def do_convert(self):
name_generator = TargetNameGenerator()
files = self.filelist.get_files()
self.converter_queue = TaskQueue()
self.converter_queue.set_on_queue_finished(self.on_queue_finished)
self.converter_queue.connect('done', self.on_queue_finished)
for sound_file in files:
gtk_iteration()
self.converter_queue.add(Converter(
Expand Down Expand Up @@ -408,12 +408,12 @@ def on_aboutdialog_response(self, *args):
def selection_changed(self, *args):
self.set_sensitive()

def on_queue_finished(self, queue):
def on_queue_finished(self, __=None):
"""Should be called when all conversions are completed."""
total_time = queue.get_duration()
total_time = self.converter_queue.get_duration()
msg = _('Conversion done in %s') % format_time(total_time)
error_count = len([
task for task in queue.done
task for task in self.converter_queue.done
if task.error
])
if error_count > 0:
Expand Down
31 changes: 17 additions & 14 deletions soundconverter/util/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,14 @@
# USA


class Task:
from gi.repository import GObject


class Task(GObject.Object):
"""Abstract class of a single task."""
def __init__(self):
super().__init__()

# avoid storing a variable called timer in your inheriting class
def get_progress(self):
"""Fraction of how much of the task is completed.
Expand Down Expand Up @@ -49,18 +55,15 @@ def run(self):
"""Run the task."""
raise NotImplementedError()

# don't overwrite
def done(self):
"""Emit a "done" event."""
self.emit('done')

def set_callback(self, callback):
"""For the Taskqueue to get notified when the Task is done.

Don't overwrite this function.
Make sure to call self.callback() when your task that inherits from
Task is finished.
"""
def callback_wrapped():
# automatically provide self as argument, so that
# it's only required to call callback() without any argument
return callback(self)
self.callback = callback_wrapped
GObject.signal_new(
'done',
Task,
GObject.SignalFlags.RUN_FIRST,
None,
[]
)
66 changes: 46 additions & 20 deletions soundconverter/util/taskqueue.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
import time
from queue import Queue

from gi.repository import GObject, GLib

from soundconverter.util.settings import get_num_jobs
from soundconverter.util.logger import logger
from soundconverter.interface.mainloop import gtk_iteration


class TaskQueue:
class TaskQueue(GObject.Object):
"""Executes multiple tasks in parallel."""
def __init__(self):
self._on_queue_finished = None
Expand All @@ -40,6 +42,8 @@ def __init__(self):
self.paused = False
self._timer = Timer()

super().__init__()

def add(self, task):
"""Add a task to the queue that will be executed later.
Expand All @@ -48,7 +52,6 @@ def add(self, task):
task : Task
Any object inheriting from Task
"""
task.set_callback(self.task_done)
task.timer = Timer()
self.all_tasks.append(task)
self.pending.put(task)
Expand Down Expand Up @@ -116,46 +119,60 @@ def task_done(self, task):
task : Task
A completed task
"""
# avoid adding duplicate signal handlers if the queue is restarted
task.disconnect_by_func(self.task_done)

if task in self.done:
raise Exception('Duplicate task_done call')

if self.finished:
return

self.done.append(task)
task.timer.stop()
if task not in self.running:
logger.warning('tried to remove task that was already removed')
else:
self.running.remove(task)

self.done.append(task)
self.running.remove(task)

if self.pending.qsize() > 0:
self.start_next()
elif len(self.running) == 0:
self.finished = True
self._timer.stop()
if self._on_queue_finished is not None:
self._on_queue_finished(self)
self.emit('done')

def start_next(self):
def start_next(self, _=None):
"""Start the next task if available."""
if self.pending.qsize() > 0:
task = self.pending.get()

task.connect('done', self.task_done)

self.running.append(task)

# - Just looping over self.pending causes too many tasks to be running in
# parallel
# - There is no semaphore mechanism for glib to do it in a simple while
# loop, in order to limit it to num_jobs
# - I don't think GLib.Mutex works with main-loop single-thread
# parallelization and the whole thread will stop here
# - Telling tasks to start the next task via a python callback or event
# causes the runtime to crash due to recursion with too many tasks.
# However, idle_add prevents those recursion depth problems
GLib.idle_add(task.run)
task.timer.start()
task.run()

def run(self):
"""Run as many tasks as the configured number of jobs.
Finished tasks will trigger running the next task over the task_done
callback.
"""
"""Run all tasks."""
self.finished = False
self._timer.start()
num_jobs = get_num_jobs()

while self.pending.qsize() > 0 and len(self.running) < num_jobs:
# Run as many tasks as the configured number of jobs. Finished tasks will
# trigger running the next task via a event
self.start_next()

def set_on_queue_finished(self, on_queue_finished):
"""Add a custom function to be used when the queue finishes."""
self._on_queue_finished = on_queue_finished
gtk_iteration()

def get_duration(self):
"""Get for how many seconds the queue has been actively running.
Expand Down Expand Up @@ -218,6 +235,15 @@ def get_remaining(self):
return remaining


GObject.signal_new(
'done',
TaskQueue,
GObject.SignalFlags.RUN_FIRST,
None,
[]
)


class Timer:
"""Time how long the TaskQueue took."""
# separate class because I would like to not pollute the TaskQueue
Expand Down
Binary file added tests/bulk-test-data/sample_0.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_1.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_10.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_100.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_101.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_102.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_103.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_104.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_105.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_106.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_107.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_108.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_109.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_11.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_110.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_111.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_112.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_113.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_114.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_115.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_116.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_117.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_118.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_119.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_12.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_120.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_121.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_122.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_123.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_124.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_125.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_126.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_127.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_128.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_129.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_13.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_130.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_131.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_132.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_133.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_134.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_135.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_136.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_137.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_138.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_139.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_14.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_140.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_141.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_142.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_143.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_144.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_145.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_146.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_147.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_148.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_149.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_15.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_150.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_151.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_152.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_153.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_154.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_155.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_156.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_157.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_158.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_159.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_16.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_160.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_161.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_162.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_163.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_164.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_165.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_166.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_167.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_168.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_169.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_17.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_170.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_171.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_172.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_173.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_174.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_175.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_176.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_177.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_178.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_179.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_18.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_180.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_181.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_182.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_183.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_184.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_185.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_186.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_187.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_188.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_189.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_19.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_190.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_191.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_192.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_193.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_194.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_195.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_196.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_197.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_198.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_199.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_2.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_20.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_200.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_201.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_202.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_203.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_204.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_205.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_206.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_207.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_208.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_209.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_21.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_210.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_211.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_212.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_213.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_214.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_215.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_216.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_217.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_218.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_219.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_22.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_220.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_221.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_222.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_223.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_224.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_225.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_226.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_227.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_228.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_229.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_23.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_230.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_231.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_232.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_233.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_234.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_235.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_236.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_237.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_238.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_239.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_24.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_240.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_241.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_242.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_243.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_244.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_245.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_246.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_247.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_248.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_249.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_25.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_250.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_251.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_252.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_253.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_254.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_255.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_256.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_257.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_258.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_259.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_26.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_260.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_261.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_262.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_263.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_264.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_265.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_266.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_267.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_268.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_269.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_27.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_270.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_271.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_272.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_273.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_274.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_275.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_276.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_277.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_278.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_279.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_28.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_280.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_281.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_282.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_283.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_284.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_285.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_286.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_287.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_288.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_289.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_29.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_290.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_291.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_292.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_293.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_294.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_295.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_296.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_297.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_298.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_299.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_3.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_30.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_31.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_32.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_33.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_34.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_35.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_36.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_37.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_38.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_39.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_4.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_40.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_41.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_42.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_43.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_44.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_45.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_46.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_47.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_48.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_49.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_5.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_50.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_51.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_52.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_53.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_54.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_55.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_56.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_57.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_58.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_59.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_6.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_60.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_61.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_62.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_63.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_64.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_65.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_66.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_67.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_68.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_69.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_7.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_70.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_71.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_72.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_73.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_74.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_75.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_76.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_77.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_78.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_79.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_8.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_80.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_81.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_82.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_83.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_84.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_85.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_86.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_87.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_88.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_89.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_9.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_90.mp3
Binary file not shown.
Binary file added tests/bulk-test-data/sample_91.mp3
Binary file not shown.
Loading

0 comments on commit 8c305c3

Please sign in to comment.