Date | Commit message (Collapse) |
|
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).
|
|
We should not leave sinks running when nothing is playing,
since that blocks the sound device from being used by others.
|
|
We do not explicitly resample/dither/downmix without users
permission.
|
|
This allows skipping periods of silence/noise in between music tracks.
This should be useful if the recorder is left running during
intermission or during equipment swaps.
|
|
When a player is idle and a track is added to an empty tracklist,
we should not repeat the first track added to the tracklist. Avoid
that by advancing the tracklist to the current track.
|
|
These are common output targets, at least for my workflow.
|
|
We should only reset the tracklist if the user has completely
iterated through the list of tracks to be played.
|
|
We have no public Ruby API, only socket protocols and data formats.
|
|
This is necessary to handle the case where the tracklist is empty,
clients get confused and timeout the response if we attempt to emit
an empty string.
|
|
"wall" is analogous to the wall(1) command, so we shall use that
instead of echo.
|
|
Because sometimes a song is just stuck in our head.
Or MPRIS 2.0 wants us to implement it this way...
|
|
Non-repeating tracklists should stop playing when there's nothing
to go back to.
|
|
This should make implementing SetPosition in the MPRIS 2.0 spec
possible.
|
|
This means we can go back and forth in the tracklist like a normal
music player. This will allow an easier MPRIS 2.0 implementation.
|
|
This is a more accurate depiction of what happens,
and we'll implement "next" and "previous" commands in the future.
|
|
We should return to the starting position of the tracklist if we
are idle.
|
|
Otherwise we end up constantly pushing tracks to the top of the
queue and getting surprising behavior if seek is called repeatedly.
|
|
We already flush the currently playing track into the head of the
queue upon player exit (even if it was in the @tl), so we should use
@tl.next_track as usual instead of @tl.cur_track in case the queue
is empty.
|
|
We need to preserve the go_to-specified position for next_track,
doing otherwise would cause us to always be off-by-one.
|
|
This allows easier scripting if we want to add a bunch of tracks
|
|
This should allow us to repeat through a list of tracks with relative
ease. There is a rudimentary dtas-tl client implemented. This
may be removed in the future.
|
|
This should allow us to eventually implement a MPRIS 2.0-compliant
tracklist.
|
|
Minor bugfixes, this allows users to setup targets easily
without introducing them to the ":" Rubyism for symbols.
Also, use "track_start" instead of "track_first" to match
the existing published examples for numbering the first
track.
While we're at it, detect the decoded sample precision
correctly for dither use.
|
|
Having it return nil in a noop function seems wrong.
We can't silently discard the value (unlike pipe_size=)
|
|
We do not need it anymore since we only write to the targets
returned by Sink#spawn.
|
|
This seems to be working out nicely. Having a basic integration
test should be enough to get us started for now.
|
|
This will allow users to more-easily edit configs and feel
like a real shell. We no longer mistakenly expand nil env
variables to "" anymore, either.
|
|
Rounding should be more accurate, even though my original awk
snippet truncated the output.
|
|
This is lacking tests and documentation, but it works from
a old trivial sample I had from a recording I previously
split using plain POSIX shell
splitfx is like make(1) for splitting and minor audio
editing. It also allows any number of effects.
|
|
Singleton methods tend to be bad like this.
TODO: write tests for this.
|
|
This allows users to display the current env value for introspection
|
|
This allows me to hit Ctrl-C on a dtas-player(1) process, wait on
termination of the player, and immediately restart it without
worrying about sink conflicts upon restart.
Before this change, sinks would continue running for a bit
(depending on buffer sizes).
|
|
stop_sinks is already defined, so avoid repeating this loop
|
|
This helps in case dtas-player is hit with SIGKILL or the system
crashes. This does not fsync(2) as that could introduce delays on
slow filesystems. Users should open the file manually and fsync
themselves if they need to.
|
|
Some containers (e.g. large VOBs) are not easily probed and require
additional options for avprobe/ffprobe to find audio streams. We do
this by looping and increasing the duration/size of the probe to
find new audio streams.
This seems to work reasonably well for some DVD rips I have until
seeking is required. This breaks if the seek point (including seeks
for source effects) exceeds the avprobe/ffprobe -analyzeduration.
Anyways, I recommend extracting the audio stream (without
transcoding) out of the VOB container as the best way to go.
Something like:
avconv -analyzeduration 2G -probesize 2G \
-i input.vob -vn -sn -c:a copy -map 0:$STREAM_NR output.ext
|
|
The whole dtas project is committed to giving as much rope as users
need!
|
|
This is reproducible on a video file with a mono audio stream
when attempting playback in stereo.
|
|
No need to add the vol effect if it's going to be a noop.
|
|
We don't need it since IO#read(bytes, buf) will convert to
ASCII-8BIT anyways. Everywhere else, we ensure path names are
already binary. We do this mainly at the client layer before using
Shellwords to escape the paths.
We also must be careful about parsing output from soxi/avprobe
which can show us metadata in whatever encoding is in the file.
We must still handle data from parsing command output as binary,
as the encoding of file metadata tends to vary.
This also should buy us Syck compatibility for Ruby 1.9.3 users
on Debian systems where Ruby 1.9.3 still uses Syck.
|
|
All files we distribute in the tarball need to have a
copyright/license specified for Savannah.
We don't need the example state file anymore.
|
|
It's possible to get zero samples when playing streams of
unknown length (e.g. over Icecast over HTTP)
|
|
I should really write a test case for this, maybe later.
|
|
No we do not want to confuse `ri' users with this.
|
|
We expose no public API, so avoid cluttering users disk space with
useless ri/rdoc and avoid cluttering the web with HTML nobody will
read.
|
|
@current is only set if is active with a pid, now, so all
of our checks for @current.pid are redundant and confusing.
|
|
This should hopefully prevent us from getting wedged
if we hit an error while preparing to spawn (or during spawn).
|
|
Showing the warning for the same file over and over again is
annoying when seeking a file handled by avconv/ffmpeg, so stop
doing it.
While we're at it, the error handling for __load_comments is totally
redundant (absent of race conditions if another process modifies the
file). However, if we do hit races, all the other soxi invocations
would be racy, too; but we really just shouldn't care about such
a corner case in here.
|
|
Since ffmpeg/ffprobe are wrappers around their libav-variants,
I haven't had the chance to actually test with "real" ffmpeg,
but the usage is probably similar enough to not matter.
|
|
soxi may not handle some files correctly and detect zero samples
without error-ing out. If sox can't detect the sample count
or the file is really empty, then there's no point trying futher
and we'll fall back to avconv.
|