about summary refs log tree commit homepage
DateCommit message (Collapse)
2014-10-18sink: favor &:proc form instead of blocks
This generates smaller bytecode and avoids unnecessary captures.
2014-10-18unix_server: fix for infinite loop
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'
2014-09-22dtas-console: force encoding for current locale
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).
2014-08-26doc: document "tl get"/"dtas-tl cat" escaping gotcha
We shell-escape filenames, so they may not show up properly when shuttled across the wire.
2014-08-26client_handler: minor cleanup (favor &:proc)
This reduces captures and is more consistent with our other code.
2014-08-16rely on filesystem encoding
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.
2014-08-16xs: favor &: block style for simple cases
This avoids captures
2014-07-06tests: hoist out pluck generation
This allows the same sound to be reused in tests.
2014-07-05fadefx: remove module
This will not be needed after all.
2014-06-30remove builtin-$FADEFX support
This is more generically supported via variables.
2014-06-30test_splitfx: fix tests without opus{enc,dec}
Just skip the test for now since systems without opusenc and opusdec are becoming rarer.
2014-06-30test/helper: ancient minitest compatibility
RubyGems is not available on some LTS distros (Ubuntu precise with Ruby 1.9.3-p0)
2014-06-23trimfx: initial cut of scheduling + gap filling
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)
2014-06-06update copyrights and email address for 2014
I'm still normal, and still trolling, but 80x24.org will be epic :)
2014-05-26player: style cleanup to favor &:methods
This makes the code less verbose and avoids captures.
2014-03-13test/helper: compat w/ coverage in Feature #9508
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.
2014-02-24dtas-console: add note to install "curses" gem if missing
Ruby 2.2.0dev does not bundle the "curses" gem anymore. Note: not a hard RubyGem dependency since dtas-console is optional.
2013-12-30dtas 0.7.0 - minor feature and teeny optimizations v0.7.0
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.
2013-12-27player: optimize away some more select calls
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).
2013-12-27merge some select calls for splice users
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.
2013-12-27buffer/read_write: style and minor cleanup
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.
2013-12-27unix_server: remove unnecessary begin block
We do not need a begin block here, callers will deal with it.
2013-12-27buffer/splice: favor &:method for blocks
This is slightly easier-to-read and avoids capturing local variables.
2013-12-06client_handler: style: prefer terser &:method form
We are Ruby 1.9+ only, so shorten our code just a little and hopefully make things easier-to-read.
2013-12-06buffer/read_write: broadcast_one must be non-blocking
This non-Linux code path probably broke when we minimized our use of IO#nread.
2013-12-01splitfx: support --no-dither/-D option
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.
2013-10-19INSTALL: update for 0.6.0 release
Oops, perhaps I should just stick $VERSION in the text...
2013-10-19dtas 0.6.0 - player tracklist fixes/improvements v0.6.0
* 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
2013-10-17fadefx: initial commit
This allows parsing and will eventually interact with trimfx.
2013-10-17trimfx: flesh out parsing of commands
Only lightly tested, but this should give us some idea of where we'll be going...
2013-10-15trimfx: flesh out to_sox_arg implementation
This will be dependent upon sox for the trim effect, at least. Other bits will be exposed as needed.
2013-10-13trimfx: initial bits
This will allow editing individual portions of audio of a larger file while creating cross fade effects to join them.
2013-10-13use shorter socket constants for sockets
This is to be compatible with Rubinius, but also works with MRI.
2013-10-12IO#nread compatibility for Rubinius (Linux-only)
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).
2013-10-10dtas-tl: "reto" command does not scan track IDs
Using a regexp to match trackIDs is probably not intended by the user.
2013-10-10player: "tl remove" properly stops current track
This simplifies the check for the current track and won't attempt to compare track IDs not on the tracklist.
2013-10-10tracklist: fix off-by-one when adding track
Otherwise we end up going past the end of the list.
2013-10-10format: common detection code (based on sox)
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.
2013-10-10tracklist: update position when track is added
We don't want to repeat tracks if a track was added to a spot before the current position on the tracklist.
2013-10-09dtas-partstats: initial implementation
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).
2013-10-09player: "tl remove" drops the track from the queue
A paused/seeked track in the tracklist may end up in the queue.
2013-10-09tracklist: remove_track updates tracklist position
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.
2013-10-08player: "tl add" may trigger player start
The player should start playing the new track if the current tracklist is exhausted and not paused.
2013-10-06pipe: use memoized IO#nonblock? in blocking case
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).
2013-10-06buffer: remove ioctl syscall in common paths
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.
2013-10-06player: delay tracklist reset until asked to play
This prevents us from resetting the tracklist when we add new tracks and want to restart playback.
2013-10-06buffer/read_write: fix undefined local variable
We must define the variable for tracking buffer length. This only affected non-Linux kernel users.
2013-10-05player: add factor out redundant condition check
The addition of a "need_to_queue" method should reduce the amount of cognitive overhead required to parse these conditions
2013-10-02splitfx: default to default DTAS::Format if unspecified
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.
2013-09-30dtas 0.5.0 v0.5.0
* 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