Commit graph

675 commits

Author SHA1 Message Date
Lennart Poettering
61b07768c2 add suspend_within_thread() callbacks to pa_sink_input/pa_source_output 2009-04-07 00:46:20 +02:00
Lennart Poettering
35a4a0baa8 enable debugging output based on if DEBUG_DATA macro is set 2009-04-07 00:41:45 +02:00
Lennart Poettering
e61728e67a Make sure we don't get stuck when prebuf is too high
If prebuf is greater than tlength minus minreq we might end up waiting
for the buffer to fill up further however without ever asking for more
data from the client since less minreq bytes might be missing.

This fixes bug #440
2009-04-06 22:13:41 +02:00
Lennart Poettering
7fc2382a0a properly handle interpolation when queried x is left of last data position 2009-04-06 16:38:38 +02:00
Lennart Poettering
4b521e5d24 be a bit more verbose about the busses we are connected to 2009-04-06 04:20:12 +02:00
Lennart Poettering
90f4fdb071 make sure we keep a reference of the bus connection during the whole runtime if we manage to acquire the bus name 2009-04-06 02:31:22 +02:00
Lennart Poettering
6ba3333030 Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio 2009-04-05 03:05:51 +02:00
Lennart Poettering
14e11e4533 Fix a couple of races in native protocol
Also make sure we account for recording memblock that are currently 'on
the fly' between the main and the IO thread.

Also makes a couple of timing calls that were done in different calls
in a single inter-thread call. That way there is a better guarantee that
they match up.
2009-04-05 02:59:02 +02:00
Lennart Poettering
ce73e715c9 introduce pa_{sink|source}_get_latency_within_thread() 2009-04-05 02:46:38 +02:00
Lennart Poettering
d035f4a3f3 Modify smoothing code to make cubic interpolation optional and allow 'quick fixups' on resuming
The primary reason for this change is to allow time graphs that do not
go through the origin and hence smoothing starting from the origin is
not desired. This change will allow passing time data into the smoother
while paused and then abruptly use that data without smoothing using the
'quick fixup' flag when resuming.

Primary use case is allowing recording time graphs where the data
recorded originates from a time before the stream was created. The
resulting graft will be shifted and should not be smoothened to go
through the origin.
2009-04-05 02:26:02 +02:00
Lennart Poettering
9bea2503d9 increase log buffer further 2009-04-04 04:13:11 +02:00
Maarten Bosmans
8bcb9c6910 various spelling fixes 2009-04-04 02:27:13 +02:00
Lennart Poettering
373b5efe51 properly account for seeks in the requested_bytes counter 2009-04-01 23:05:09 +02:00
Lennart Poettering
380e97a596 use machine id instead of hostname to identify local connections 2009-04-01 21:15:52 +02:00
Lennart Poettering
75a8d18285 pass destination source/sink when moving streams so that we can access them 2009-04-01 03:04:39 +02:00
Lennart Poettering
c2f6d090c7 don't access i->sink if it is not set 2009-04-01 03:03:20 +02:00
Lennart Poettering
76c44d104d be a bit more verbose about max_request changes 2009-03-31 21:36:45 +02:00
Lennart Poettering
cebaa98b38 Log underruns 2009-03-31 21:36:09 +02:00
Lennart Poettering
5cbd4b74a2 update command name table 2009-03-31 20:43:05 +02:00
Finn Thain
5e11972076 revive solaris module
On Wed, 4 Mar 2009, Lennart Poettering wrote:

[snip]
> > This patch disables link map/library versioning unless ld is GNU ld.
> > Another approach for solaris would be to use that linker's -M option,
> > but I couldn't make that work (due to undefined mainloop, browse and
> > simple symbols when linking pacat. I can post the errors if anyone is
> > intested.)
>
> The linking in PA is a bit weird since we have a cyclic dependency
> between libpulse and libpulsecommon which however is not explicit.

Could that affect the pacat link somehow?

What are the implications for client apps that link with the non-versioned
libraries I've been building on solaris?

[snip]
> >  struct userdata {
> >      pa_core *core;
> > @@ -87,15 +92,24 @@ struct userdata {
> >
> >      pa_memchunk memchunk;
> >
> > -    unsigned int page_size;
> > -
> >      uint32_t frame_size;
> > -    uint32_t buffer_size;
> > -    unsigned int written_bytes, read_bytes;
> > +    int32_t buffer_size;
> > +    volatile uint64_t written_bytes, read_bytes;
> > +    pa_mutex *written_bytes_lock;
>
> Hmm, we generally try do do things without locking in PA. This smells as
> if it was solvable using atomic ints as well.
>
> Actually, looking at this again I get the impression these mutex are
> completely unnecessary here. All functions that lock these mutexes are
> called from the IO thread so no locking should be nessary.
>
> Please don't use volatile here. I am pretty sure it is a misuse. Also
> see http://kernel.org/doc/Documentation/volatile-considered-harmful.txt
> which applies here too I think.

OK, I've removed the locks. For some reason I thought that the get_latency
function was called from two different threads.

> > +static void sink_set_volume(pa_sink *s) {
> > +    struct userdata *u;
> > +    audio_info_t info;
> > +
> > +    pa_assert_se(u = s->userdata);
> > +
> > +    if (u->fd >= 0) {
> > +        AUDIO_INITINFO(&info);
> > +
> > +        info.play.gain = pa_cvolume_avg(&s->virtual_volume) * AUDIO_MAX_GAIN / PA_VOLUME_NORM;
> > +        assert(info.play.gain <= AUDIO_MAX_GAIN);
>
> I'd prefer if you'd use pa_cvolume_max here instead of pa_cvolume_avg()
> because this makes the volume independant of the balance.
>
> > -    info.play.error = 0;
> > +        info.play.gain = pa_cvolume_avg(&s->virtual_volume) * AUDIO_MAX_GAIN / PA_VOLUME_NORM;
> > +        assert(info.play.gain <= AUDIO_MAX_GAIN);
>
> Same here. (i.e. for the source)

Done and done.

> > +            if (u->sink->thread_info.rewind_requested)
> > +                pa_sink_process_rewind(u->sink, 0);
>
> This is correct.
>
> >
> >              err = ioctl(u->fd, AUDIO_GETINFO, &info);
> >              pa_assert(err >= 0);
>
> Hmm, if at all this should be pa_assert_se(), not pa_assert() (so that
> it is not defined away by -DNDEBUG). However I'd prefer if the error
> would be could correctly. (I see that this code is not yours, but
> still...)

Done.

> > +                        case EINTR:
> > +                            break;
>
> I think you should simply try again in this case...

Done.

> > +                        case EAGAIN:
> > +                            u->buffer_size = u->buffer_size * 18 / 25;
> > +                            u->buffer_size -= u->buffer_size % u->frame_size;
> > +                            u->buffer_size = PA_MAX(u->buffer_size, (int32_t)MIN_BUFFER_SIZE);
> > +                            pa_sink_set_max_request(u->sink, u->buffer_size);
> > +                            pa_log("EAGAIN. Buffer size is now %u bytes (%llu buffered)", u->buffer_size, buffered_bytes);
> > +                            break;
>
> Hmm, care to explain this?

EAGAIN happens when the user requests a buffer size that is too large for
the STREAMS layer to accept. We end up looping with EAGAIN every time we
try to write out the rest of the buffer, which burns enough CPU time to
trip the CPU limit.

So, I reduce the buffer size with each EAGAIN. This gets us reasonably
close to the largest usable buffer size. (Perhaps there's a better way to
determine what that limit is, but I don't know how.)

> > +
> > +            pa_rtpoll_set_timer_absolute(u->rtpoll, xtime0 + pa_bytes_to_usec(buffered_bytes / 2, &u->sink->sample_spec));
> > +        } else {
> > +            pa_rtpoll_set_timer_disabled(u->rtpoll);
> >          }
>
> Hmm, you schedule audio via timers? Is that a good idea?

Perhaps not. I won't know until I test on more hardware.

But, given that we have rt priority and high resolution timers on solaris,
I think it is OK in theory...

The reason I used a timer was to minimise CPU usage and avoid the CPU
limit. Recall that getting woken up by poll is not an option for playback
unfortunately. We can arrange for a signal when the FD becomes writable,
but that throws out the whole buffer size concept, which acts to reduce
latency.

> That really only makes sense if you have to deal with large buffers and
> support rewinding.

I've implemented rewind support, but I'm still not sure that I have
understood the concept; I take it that we "rewind" (from the point-of-view
of the renderer, not the sink) so that some rendered but as yet unplayed
portion of the memblock/buffers can then be rendered again?

> Please keep in mind that the system clock and the sound card clock
> deviate. If you use the system timers to do PCM scheduling ou might need
> a pa_smoother object that is able to estimate the deviation for you.

Actually, in an earlier version I did use a smoother (after reading about
that in the wiki). But because of the non-monotonic sample counter (bug?)
I decided that it probably wasn't worth the added complexity so I removed
it. I'll put the smoother back if I can figure out the problem with the
sample counter.

>
> > +    u->frame_size = pa_frame_size(&ss);
> >
> > -    if ((fd = open(p = pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), mode | O_NONBLOCK)) < 0)
> > +    u->buffer_size = 16384;
>
> It would appear more appropriate to me if the buffer size is adjusted by
> the sample spec used.

Done.

> One last thing: it would probably be a good idea to allocate a pa_card
> object and attach the sink and the source to it.

It is possible to open /dev/audio twice by loading the solaris module
twice -- once for the sink (passing record=0) and once for source (passing
playback=0), thus giving seperate threads/LWPs for source and sink. It
might be misleading to allocate two cards in that situation?

> Right now pa_cards are mostly useful for switching profiles but even if
> you do not allow switching profiles on-the-fly it is of some value to
> find out via the cards object which source belongs to which sink.
>
> Otherwise I am happy!
>
> Thanks for your patch! I'd be thankful if you could fix the issues
> pointed out and prepare another patch on top of current git!

No problem. Patch follows. It also includes a portability fix for
pa_realpath and a fix for a bug in the pa_signal_new() error path that
causes signal data be freed if you attempt to register the same signal
twice.

> I hope I answered all your questions,

Your answers were very helpful, thanks.

Finn

>
> Lennart
>
>
2009-03-31 01:23:36 +02:00
Maarten Bosmans
4a40aed9c0 handle failure to parse proplist in cli-command gracefully 2009-03-31 00:43:48 +02:00
Lennart Poettering
d33be12fde Merge commit 'elmarco/dbus' 2009-03-30 20:26:27 +02:00
Lennart Poettering
649c982222 Use pa_source_set_max_rewind_within_thread() for updating the monitor source's max_rewind 2009-03-30 20:19:32 +02:00
Marc-André Lureau
eb93e2537a dbus: split dbus-util into dbus-shared
modules: fix dbus-util include
pulse: get dbus at context connection
2009-03-30 20:56:55 +03:00
Lennart Poettering
061344fbd7 Merge commit 'origin/master' 2009-03-30 19:14:09 +02:00
Lennart Poettering
65b787d000 notify clients about tlength changes 2009-03-30 18:46:12 +02:00
Lennart Poettering
b349dae6e1 add pa_memblockq_apply_attr()/pa_memblockq_get_attr() 2009-03-30 18:27:07 +02:00
Lennart Poettering
7c37c37fff document more often the context certain functions are called in 2009-03-30 18:26:23 +02:00
Lennart Poettering
7f5481ede0 simplify latency config functions a bit and make them callable in more contexts 2009-03-30 18:23:48 +02:00
Lennart Poettering
d04f3e1aef Trigger move callback a little bit earlier so that no IO thread is running 2009-03-30 18:21:34 +02:00
Lennart Poettering
87d63b19a3 Small fix for MacOSX compat
Issue originally pointed out by Igor Zubkov.
2009-03-27 14:37:58 +01:00
Lennart Poettering
db714bfea6 fix typo 2009-03-27 00:06:15 +01:00
Lennart Poettering
3813034cef add missing initialization 2009-03-25 23:49:26 +01:00
Lennart Poettering
39576ec829 on monitor source be fine with any latency range set by the sink 2009-03-25 16:31:16 +01:00
Lennart Poettering
6defb1a6bf add missing whitespace 2009-03-25 16:30:46 +01:00
Lennart Poettering
2c1eaa7593 copy latency flags from sink to monitor source 2009-03-25 16:30:28 +01:00
Lennart Poettering
c367a885dc fix misplace _ref() calls that should have been _assert_ref() 2009-03-25 03:44:49 +01:00
Lennart Poettering
f6a6d01354 optionally skip initial frames in backtrace 2009-03-25 03:14:00 +01:00
Lennart Poettering
8460fac285 don't show full so path in backtrace 2009-03-25 02:50:57 +01:00
Lennart Poettering
e41ec51f1b add simple ref counting debugging framework 2009-03-25 02:42:18 +01:00
Lennart Poettering
577259bb15 trivial simplification 2009-03-25 02:39:41 +01:00
Lennart Poettering
892a83945e simplify things and make sure timing setters can be called in most contexts 2009-03-25 00:33:35 +01:00
Lennart Poettering
44ca897769 introduce new flag that marks sinks/sources which can adjust the latency dynamically 2009-03-25 00:30:54 +01:00
Lennart Poettering
9bca59efc1 make pa_source_set_max_rewind() work similar to pa_sink_set_max_rewind() 2009-03-25 00:26:44 +01:00
Lennart Poettering
9151107cb9 get rid of 'default' min/max latencies, simplify things by just having absolute boundaries 2009-03-25 00:25:17 +01:00
Lennart Poettering
c64d8cbcc7 Allow calling pa_{sink|source}_update_proplist() without an actual proprlist 2009-03-24 21:17:55 +01:00
Lennart Poettering
2f9a784167 set request/rewind sizes only via accessor functions 2009-03-24 21:13:41 +01:00
Lennart Poettering
aa92ff408c simplify latency range by not allowing stored 'wildcard' ranges anymore 2009-03-24 21:06:57 +01:00
Lennart Poettering
e6be9481dc only decrease timer slack, never increase 2009-03-24 20:59:54 +01:00
Lennart Poettering
52dcb950ef add pa_assert_cc() for compile time assertions 2009-03-23 21:03:52 +01:00