Date | Commit message (Collapse) |
|
Array#each already returns the array, so there's no need to
use the more confusing Array#map! block
|
|
Followup to commit 698e1f04580839ea29647f285b39b88fcbb46071
"process: update comment for bug workaround"
|
|
We're certain this is a workaround for a bug. We may remove the
workaround at some point in the future; but not until the rest of
the world has had a chance to upgrade, too.
|
|
We only drop dead connections, not live ones. This is noticeable
on my home machine when using the "powersave" CPU governor.
|
|
This generates smaller bytecode and avoids unnecessary captures.
Perhaps the Ruby optimizer can be taught to handle this
automatically.
|
|
This generates smaller bytecode and avoids unnecessary captures.
|
|
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 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 will not be needed after all.
|
|
This is more generically supported via variables.
|
|
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.
|
|
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.
|
|
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).
|
|
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.
|
|
Oops.
|
|
This gives us consistency with the "cue prev" command,
is easier-to-type, and is consistent in length with "tl next".
We'll just map "previous" -> "tl prev" when we implement the
MPRIS bridge.
|
|
This adds the ability to seek internally within FLAC file
based on the internal CUE sheet. Other formats may be supported
in the future, but FLAC is the only one I know of which supports
embedded cue sheets.
Note: flac 1.3.0 is recommended for users of non-CDDA-compatible
formats.
See updates to dtas-player_protocol(7) for details.
|
|
Using "tl goto" implies we start playback of the player is idle.
|
|
This may be used to avoid automatic:
* resampling (rate)
* down/upmixing (channel)
* dither/truncation (bits)
Using any bypass mode means we can no longer guarantee gapless
playback for audio collections where rate, channel, or bits vary.
This can however be useful when CPU usage is too high. This may
also be useful in audio engineering situations.
|
|
This is an internal class, and we don't have a public Ruby API
anyways.
|
|
sox(1) may gain the ability to natively encode to Opus one day
without using opusenc(1), so make it more explicit we are relying
on opusenc(1).
|