| 147 | } |
| 148 | |
| 149 | static int start_jack(AVFormatContext *context) |
| 150 | { |
| 151 | JackData *self = context->priv_data; |
| 152 | jack_status_t status; |
| 153 | int i, test; |
| 154 | |
| 155 | /* Register as a JACK client, using the context url as client name. */ |
| 156 | self->client = jack_client_open(context->url, JackNullOption, &status); |
| 157 | if (!self->client) { |
| 158 | av_log(context, AV_LOG_ERROR, "Unable to register as a JACK client\n"); |
| 159 | return AVERROR(EIO); |
| 160 | } |
| 161 | |
| 162 | sem_init(&self->packet_count, 0, 0); |
| 163 | |
| 164 | self->sample_rate = jack_get_sample_rate(self->client); |
| 165 | self->ports = av_malloc_array(self->nports, sizeof(*self->ports)); |
| 166 | if (!self->ports) |
| 167 | return AVERROR(ENOMEM); |
| 168 | self->buffer_size = jack_get_buffer_size(self->client); |
| 169 | |
| 170 | /* Register JACK ports */ |
| 171 | for (i = 0; i < self->nports; i++) { |
| 172 | char str[32]; |
| 173 | snprintf(str, sizeof(str), "input_%d", i + 1); |
| 174 | self->ports[i] = jack_port_register(self->client, str, |
| 175 | JACK_DEFAULT_AUDIO_TYPE, |
| 176 | JackPortIsInput, 0); |
| 177 | if (!self->ports[i]) { |
| 178 | av_log(context, AV_LOG_ERROR, "Unable to register port %s:%s\n", |
| 179 | context->url, str); |
| 180 | jack_client_close(self->client); |
| 181 | return AVERROR(EIO); |
| 182 | } |
| 183 | } |
| 184 | |
| 185 | /* Register JACK callbacks */ |
| 186 | jack_set_process_callback(self->client, process_callback, self); |
| 187 | jack_on_shutdown(self->client, shutdown_callback, self); |
| 188 | jack_set_xrun_callback(self->client, xrun_callback, self); |
| 189 | |
| 190 | /* Create time filter */ |
| 191 | self->timefilter = ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5); |
| 192 | if (!self->timefilter) { |
| 193 | jack_client_close(self->client); |
| 194 | return AVERROR(ENOMEM); |
| 195 | } |
| 196 | |
| 197 | /* Create FIFO buffers */ |
| 198 | self->filled_pkts = av_fifo_alloc2(FIFO_PACKETS_NUM, sizeof(AVPacket), 0); |
| 199 | /* New packets FIFO with one extra packet for safety against underruns */ |
| 200 | self->new_pkts = av_fifo_alloc2((FIFO_PACKETS_NUM + 1), sizeof(AVPacket), 0); |
| 201 | if (!self->new_pkts) { |
| 202 | jack_client_close(self->client); |
| 203 | return AVERROR(ENOMEM); |
| 204 | } |
| 205 | if ((test = supply_new_packets(self, context))) { |
| 206 | jack_client_close(self->client); |
no test coverage detected