Date | Commit message (Collapse) |
|
Occasionally, killing a sink from an external process could result in an
infinite loop due to the lack of close notification from __dst_error (in
DTAS::Buffer) up to the top-level event loop. Since it is not easy to
notify the top-level event loop, we'll detect closed IOs after-the-fact
and retry as needed in a cold rescue path.
This fixes an occasional error (usually when using a non-parallel make)
in the test suite:
TestPlayerIntegration#test_sink_killed_during_play:
Timeout::Error: execution expired
$HOME/dtas/test/player_integration.rb:57:in `sleep'
$HOME/dtas/test/player_integration.rb:57:in `block in wait_pid_dead'
$HOME/$RUBY/lib/ruby/2.2.0/timeout.rb:91:in `block in timeout'
$HOME/$RUBY/lib/ruby/2.2.0/timeout.rb:35:in `block in catch'
$HOME/$RUBY/lib/ruby/2.2.0/timeout.rb:35:in `catch'
$HOME/$RUBY/lib/ruby/2.2.0/timeout.rb:35:in `catch'
$HOME/$RUBY/lib/ruby/2.2.0/timeout.rb:106:in `timeout'
$HOME/dtas/test/player_integration.rb:54:in `wait_pid_dead'
test/test_player_integration.rb:42:in `test_sink_killed_during_play'
|
|
This is the one place we display the filename for users,
so it should hopefully make it displayable. Users who
care about proper display should use a locale which matches
their music collection (or rename their music collection
to match).
|
|
We shell-escape filenames, so they may not show up properly
when shuttled across the wire.
|
|
This reduces captures and is more consistent with our other code.
|
|
This avoids compatibility problems as File.expand_path respects the
"filesystem" encoding of Ruby. I'm not 100% sure this is correct,
as Ruby encoding support still confuses me, but this fixes a problem
where I attempted to add UTF-8 filename with non-US-ASCII characters
in it on ruby-trunk.
|
|
This avoids captures
|
|
This allows the same sound to be reused in tests.
|
|
This will not be needed after all.
|
|
This is more generically supported via variables.
|
|
Just skip the test for now since systems without opusenc and opusdec
are becoming rarer.
|
|
RubyGems is not available on some LTS distros (Ubuntu precise with
Ruby 1.9.3-p0)
|
|
The names are subject to change, but the idea is to
make multiple passes over the audio if effects overlap
and combine everything afterwards. Unedited portions
will be passed through sox (via trim and no other effects)
|
|
I'm still normal, and still trolling, but 80x24.org will be epic :)
|
|
This makes the code less verbose and avoids captures.
|
|
There's a feature request for better coverage support in ruby-trunk
https://bugs.ruby-lang.org/issues/9508
At minimum, we need to preserve compatibility; but we should set
aside time to take advantage of the extra coverage support.
|
|
Ruby 2.2.0dev does not bundle the "curses" gem anymore.
Note: not a hard RubyGem dependency since dtas-console is optional.
|
|
dtas-splitfx gained support --no-dither/-D option.
dtas-player should work now for non-Linux users without splice().
There are minor optimizations for users of multiple sinks with
dtas-player.
|
|
This keeps us from doing an extra IO.select when we know the sink
buffer is readable (as we just registered a sink as writable).
|
|
Avoid an additional select syscall in the splice path by injecting
the target checks into the main loop. We can do this because we
always process writers before readers. This adds additional
userspace processing, but it avoids one potentially expensive (and
potentially task-switching) syscall in many cases; so it should be
worth it to avoid skipping with small buffer.
This should avoid buffer underuns with mixed-sized buffers when
using multiple sinks.
This could work for the read_write path, too, but I don't
use that enough and this change may still be buggy even
for splice users.
|
|
Favor &:method block calls to avoid captures.
Delay the check for inflight bytes while we're at it,
since we may never need the result of FIONREAD.
|
|
We do not need a begin block here, callers will deal with it.
|
|
This is slightly easier-to-read and avoids capturing local
variables.
|
|
We are Ruby 1.9+ only, so shorten our code just a little
and hopefully make things easier-to-read.
|
|
This non-Linux code path probably broke when we minimized our
use of IO#nread.
|
|
splitfx is incapable of knowing in 100% of cases whether dithering
should be used (as it has no visibility into sox internals), so
support disabling it completely via command-line.
This is like the identical sox option, and passed to sox(1), too.
This feature is useful for splitting already-mastered 16-bit
recordings.
|
|
Oops, perhaps I should just stick $VERSION in the text...
|
|
* dtas-player - many fixes to tracklist handling
Also minor syscall reduction and a fix for non-Linux-splice users.
* the "dtas-tl reto" subcommand also works somewhat sanely, now.
There's also a bunch of work-in-progress code that's definitely not
ready for prime time and will change a lot. I'm just making this
release because the work-in-progress stuff is completely orthogonal
to the mostly-working stuff, and dtas has users other than myself
now(!)
dtas is going in several different directions related to audio, not just
playback. My immediate focus will probably be on audio editing and
hopefully 0.7.0 will have more of that[1]. Of course, critical fixes to
components people actually use will take priority (but I think
dtas-player is solid, by now.
* dtas-partstats - initial partitioning wrapper to the sox stats effect
See commit 4f1a73ed584f0f74d6b32241f02ae871f3415f4a for details.
This works, but could use some documentation...
There's also some stuff which is completely not wired up outside
of internal unit tests, but will hopefully be ready in 0.7.0
Eric Wong (21):
splitfx: default to default DTAS::Format if unspecified
player: add factor out redundant condition check
buffer/read_write: fix undefined local variable
player: delay tracklist reset until asked to play
buffer: remove ioctl syscall in common paths
pipe: use memoized IO#nonblock? in blocking case
player: "tl add" may trigger player start
tracklist: remove_track updates tracklist position
player: "tl remove" drops the track from the queue
dtas-partstats: initial implementation
tracklist: update position when track is added
format: common detection code (based on sox)
tracklist: fix off-by-one when adding track
player: "tl remove" properly stops current track
dtas-tl: "reto" command does not scan track IDs
IO#nread compatibility for Rubinius (Linux-only)
use shorter socket constants for sockets
|
|
This allows parsing and will eventually interact with trimfx.
|
|
Only lightly tested, but this should give us some idea of where
we'll be going...
|
|
This will be dependent upon sox for the trim effect,
at least. Other bits will be exposed as needed.
|
|
This will allow editing individual portions of audio of
a larger file while creating cross fade effects to join
them.
|
|
This is to be compatible with Rubinius, but also works with MRI.
|
|
We don't deal with user-space buffers, so we should be fine
using this compatibility layer and only checking the kernel
buffers (until rbx implements a proper solution).
|
|
Using a regexp to match trackIDs is probably not intended
by the user.
|
|
This simplifies the check for the current track and
won't attempt to compare track IDs not on the tracklist.
|
|
Otherwise we end up going past the end of the list.
|
|
This reduces duplication for sox-based components, which our audio
editing components will rely on. We only use avconv/ffmpeg for odd
formats which sox does not play natively, and editing audio in
strange/lossy formats is undesirable anyways.
|
|
We don't want to repeat tracks if a track was added to a spot
before the current position on the tracklist.
|
|
dtas-partstats divides large audio files into small partitions (10
seconds by default) and runs the "stats" effect of sox(1) against each
partition.
Currently it emits space-delimited output, but configurable output
options (including Sequel/SQLite) support is coming.
The intended use of this tool is for quickly finding the loudest
portions of a given recording without the need for a graphical viewer.
This can be useful for selectively applying (and testing the results of)
dynamic range compression filters.
Use with sort(1) in a pipeline is recommended in this scenario
(but again, Sequel support is coming).
|
|
A paused/seeked track in the tracklist may end up in the queue.
|
|
We should not have the position point too far past the end of the
list. This allows playback to start when we do "tl add" on
an idle player after removing something from the tracklist.
|
|
The player should start playing the new track if the current tracklist
is exhausted and not paused.
|
|
We never change the I/O directly, so avoid the expensive syscall and
only use a slightly-expensive Ruby method call instead (the Ruby
method call is fixed cost in either case).
|
|
We do not need this for single sink situations (the common case)
at all. We also do not need to check IO#nread for splice, either;
we can just do non-blocking I/O. The only common path where we
might still need it is the non-splice case with multiple sinks.
|
|
This prevents us from resetting the tracklist when we
add new tracks and want to restart playback.
|
|
We must define the variable for tracking buffer length.
This only affected non-Linux kernel users.
|
|
The addition of a "need_to_queue" method should reduce the amount of
cognitive overhead required to parse these conditions
|
|
Some users may not use nor care about $OUTFMT at all, so
just start them out with a default one based on the original
to get started.
|
|
* dtas-*edit
- account for editors which rename over files
* dtas-player
- support optional bypass mode for rate, bits, channel
This allows users to avoid any internal resampling at the
cost of losing gapless playback when files have different
decoded formats
- "tl goto" starts playback if idle (and not paused)
- support seeking based on embedded cuesheet (FLAC)
- rename "tl previous" to "tl prev"
See dtas-player_protocol(7) for the protocol extensions
* dtas-console
- allow exit via 'q' key
|
|
Oops.
|