Audio diskstream fix from torbenh.

git-svn-id: svn://localhost/ardour2/branches/3.0@3876 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard 2008-10-07 17:33:05 +00:00
parent d64ff6b659
commit ff73f4e5e1
3 changed files with 15 additions and 12 deletions

View file

@ -166,6 +166,7 @@ class AudioDiskstream : public Diskstream
int rename_write_sources (); int rename_write_sources ();
void reset_write_sources (bool, bool force = false); void reset_write_sources (bool, bool force = false);
void non_realtime_input_change (); void non_realtime_input_change ();
void non_realtime_locate (nframes_t location);
protected: protected:
friend class Auditioner; friend class Auditioner;

View file

@ -205,6 +205,18 @@ AudioDiskstream::non_realtime_input_change ()
} }
} }
void
AudioDiskstream::non_realtime_locate (nframes_t location)
{
/* now refill channel buffers */
if (speed() != 1.0f || speed() != -1.0f) {
seek ((nframes_t) (location * (double) speed()));
} else {
seek (location);
}
}
void void
AudioDiskstream::get_input_sources () AudioDiskstream::get_input_sources ()
{ {

View file

@ -224,12 +224,7 @@ Session::butler_transport_work ()
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if (!(*i)->hidden()) { if (!(*i)->hidden()) {
if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) { (*i)->non_realtime_locate (_transport_frame);
(*i)->seek ((nframes_t) (_transport_frame * (double) (*i)->speed()));
}
else {
(*i)->seek (_transport_frame);
}
} }
if (on_entry != g_atomic_int_get (&butler_should_do_transport_work)) { if (on_entry != g_atomic_int_get (&butler_should_do_transport_work)) {
/* new request, stop seeking, and start again */ /* new request, stop seeking, and start again */
@ -434,12 +429,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if (!(*i)->hidden()) { if (!(*i)->hidden()) {
if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) { (*i)->non_realtime_locate (_transport_frame);
(*i)->seek ((nframes_t) (_transport_frame * (double) (*i)->speed()));
}
else {
(*i)->seek (_transport_frame);
}
} }
if (on_entry != g_atomic_int_get (&butler_should_do_transport_work)) { if (on_entry != g_atomic_int_get (&butler_should_do_transport_work)) {
finished = false; finished = false;