~ubuntu-branches/ubuntu/oneiric/pulseaudio/oneiric

« back to all changes in this revision

Viewing changes to src/pulsecore/source-output.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel T Chen
  • Date: 2007-12-04 00:56:08 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20071204005608-y1xqvcu45g1yxtlu
Tags: 0.9.8-1ubuntu1
"Hail our new PulseAudio overlords (part two)."

* Merge from Debian unstable.
* Ubuntu-specific changes:
  - debian/control:
    + Don't build-depend on libjack0.100.0-dev or build jack module
      packages,
    + Update pulseaudio's Recommends and Suggests to accomodate
      existing promoted main packages,
    + Explicitly mention pasuspender in pulseaudio-utils's long
      description,
    + Add Vcs-Bzr URI,
    + Adhere to DebianMaintainerField;
  - debian/rules: Use multiuser for update-rc.d;
  - debian/patches/series: Retain the exclusion of
    0001-Set-ESD-socket-to-tmp-.esd-socket-to-match-up-with.patch.
* Dropped Ubuntu-specific change (absorbed into Debian source):
  debian/patches/0002-Double-esound-maximum-sample-size.patch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: source-output.c 1971 2007-10-28 19:13:50Z lennart $ */
 
1
/* $Id: source-output.c 2067 2007-11-21 01:30:40Z lennart $ */
2
2
 
3
3
/***
4
4
  This file is part of PulseAudio.
71
71
 
72
72
    pa_source_output *o;
73
73
    pa_resampler *resampler = NULL;
74
 
    char st[PA_SAMPLE_SPEC_SNPRINT_MAX];
 
74
    char st[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
75
75
 
76
76
    pa_assert(core);
77
77
    pa_assert(data);
103
103
    pa_return_null_if_fail(pa_channel_map_valid(&data->channel_map));
104
104
    pa_return_null_if_fail(data->channel_map.channels == data->sample_spec.channels);
105
105
 
 
106
    if (flags & PA_SOURCE_OUTPUT_FIX_FORMAT)
 
107
        data->sample_spec.format = data->source->sample_spec.format;
 
108
 
 
109
    if (flags & PA_SOURCE_OUTPUT_FIX_RATE)
 
110
        data->sample_spec.rate = data->source->sample_spec.rate;
 
111
 
 
112
    if (flags & PA_SOURCE_OUTPUT_FIX_CHANNELS) {
 
113
        data->sample_spec.channels = data->source->sample_spec.channels;
 
114
        data->channel_map = data->source->channel_map;
 
115
    }
 
116
 
 
117
    pa_assert(pa_sample_spec_valid(&data->sample_spec));
 
118
    pa_assert(pa_channel_map_valid(&data->channel_map));
 
119
 
106
120
    if (data->resample_method == PA_RESAMPLER_INVALID)
107
121
        data->resample_method = core->resample_method;
108
122
 
109
123
    pa_return_null_if_fail(data->resample_method < PA_RESAMPLER_MAX);
110
124
 
 
125
    if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_FIXATE], data) < 0)
 
126
        return NULL;
 
127
 
111
128
    if (pa_idxset_size(data->source->outputs) >= PA_MAX_OUTPUTS_PER_SOURCE) {
112
129
        pa_log("Failed to create source output: too many outputs per source.");
113
130
        return NULL;
122
139
                      &data->source->sample_spec, &data->source->channel_map,
123
140
                      &data->sample_spec, &data->channel_map,
124
141
                      data->resample_method,
125
 
                      !!(flags & PA_SOURCE_OUTPUT_VARIABLE_RATE)))) {
 
142
                      ((flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
 
143
                      ((flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
 
144
                      (core->disable_remixing || (flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0)))) {
126
145
            pa_log_warn("Unsupported resampling operation.");
127
146
            return NULL;
128
147
        }
153
172
    o->detach = NULL;
154
173
    o->attach = NULL;
155
174
    o->suspend = NULL;
 
175
    o->moved = NULL;
156
176
    o->userdata = NULL;
157
177
 
158
178
    o->thread_info.state = o->state;
163
183
    pa_assert_se(pa_idxset_put(core->source_outputs, o, &o->index) == 0);
164
184
    pa_assert_se(pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL) == 0);
165
185
 
166
 
    pa_log_info("Created output %u \"%s\" on %s with sample spec %s",
 
186
    pa_log_info("Created output %u \"%s\" on %s with sample spec %s and channel map %s",
167
187
                o->index,
168
188
                o->name,
169
189
                o->source->name,
170
 
                pa_sample_spec_snprint(st, sizeof(st), &o->sample_spec));
 
190
                pa_sample_spec_snprint(st, sizeof(st), &o->sample_spec),
 
191
                pa_channel_map_snprint(cm, sizeof(cm), &o->channel_map));
171
192
 
172
193
    /* Don't forget to call pa_source_output_put! */
173
194
 
229
250
    o->attach = NULL;
230
251
    o->detach = NULL;
231
252
    o->suspend = NULL;
 
253
    o->moved = NULL;
232
254
 
233
255
    if (linked) {
234
256
        pa_subscription_post(o->source->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_REMOVE, o->index);
379
401
int pa_source_output_move_to(pa_source_output *o, pa_source *dest) {
380
402
    pa_source *origin;
381
403
    pa_resampler *new_resampler = NULL;
 
404
    pa_source_output_move_hook_data hook_data;
382
405
 
383
406
    pa_source_output_assert_ref(o);
384
407
    pa_assert(PA_SOURCE_OUTPUT_LINKED(o->state));
415
438
                      &dest->sample_spec, &dest->channel_map,
416
439
                      &o->sample_spec, &o->channel_map,
417
440
                      o->resample_method,
418
 
                      !!(o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE)))) {
 
441
                      ((o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
 
442
                      ((o->flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
 
443
                      (o->core->disable_remixing || (o->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0)))) {
419
444
            pa_log_warn("Unsupported resampling operation.");
420
445
            return -1;
421
446
        }
422
447
    }
423
448
 
424
 
    pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE], o);
 
449
    hook_data.source_output = o;
 
450
    hook_data.destination = dest;
 
451
    pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE], &hook_data);
425
452
 
426
453
    /* Okey, let's move it */
427
454
    pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, 0, NULL);
447
474
    pa_source_update_status(origin);
448
475
    pa_source_update_status(dest);
449
476
 
 
477
    if (o->moved)
 
478
        o->moved(o);
 
479
 
450
480
    pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_POST], o);
451
481
 
452
482
    pa_log_debug("Successfully moved source output %i from %s to %s.", o->index, origin->name, dest->name);