Lines Matching defs:out
251 struct generic_stream_out *out = (struct generic_stream_out *)stream;
252 return out->req_config.sample_rate;
262 struct generic_stream_out *out = (struct generic_stream_out *)stream;
263 int size = out->pcm_config.period_size *
264 audio_stream_out_frame_size(&out->stream);
271 struct generic_stream_out *out = (struct generic_stream_out *)stream;
272 return out->req_config.channel_mask;
277 struct generic_stream_out *out = (struct generic_stream_out *)stream;
278 return out->req_config.format;
288 struct generic_stream_out *out = (struct generic_stream_out *)stream;
289 pthread_mutex_lock(&out->lock);
301 out->device,
302 out->dev);
303 pthread_mutex_unlock(&out->lock);
309 struct generic_stream_out *out = (struct generic_stream_out *)stream;
316 pthread_mutex_lock(&out->lock);
317 if (!out->standby) {
328 out->device = (int)val;
336 pthread_mutex_unlock(&out->lock);
342 struct generic_stream_out *out = (struct generic_stream_out *)stream;
351 pthread_mutex_lock(&out->lock);
352 str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, out->device);
353 pthread_mutex_unlock(&out->lock);
366 struct generic_stream_out *out = (struct generic_stream_out *)stream;
367 return (out->pcm_config.period_size * 1000) / out->pcm_config.rate;
378 struct generic_stream_out *out = (struct generic_stream_out *)args;
386 pthread_mutex_lock(&out->lock);
387 while (out->worker_standby || restart) {
395 if (out->worker_exit) {
398 pthread_cond_wait(&out->worker_wake, &out->lock);
401 if (out->worker_exit) {
402 if (!out->worker_standby) {
403 ALOGE("Out worker not in standby before exiting");
408 while (!shutdown && audio_vbuffer_live(&out->buffer) == 0) {
409 pthread_cond_wait(&out->worker_wake, &out->lock);
413 pthread_mutex_unlock(&out->lock);
419 PCM_OUT | PCM_MONOTONIC, &out->pcm_config);
421 ALOGE("pcm_open(out) failed: %s: channels %d format %d rate %d",
423 out->pcm_config.channels,
424 out->pcm_config.format,
425 out->pcm_config.rate
427 pthread_mutex_unlock(&out->lock);
430 buffer_frames = out->pcm_config.period_size;
435 pthread_mutex_unlock(&out->lock);
439 int frames = audio_vbuffer_read(&out->buffer, buffer, buffer_frames);
440 pthread_mutex_unlock(&out->lock);
455 static void get_current_output_position(struct generic_stream_out *out,
465 if (out->standby) {
468 const int64_t first_us = (out->underrun_time.tv_sec * 1000000000LL +
469 out->underrun_time.tv_nsec) / 1000;
471 out_get_sample_rate(&out->stream.common) /
477 *position = out->underrun_position + position_since_underrun;
481 if (*position > out->frames_written) {
484 *position, out->frames_written);
486 *position = out->frames_written;
487 out
488 out->underrun_time = curtime;
489 out->frames_total_buffered = 0;
497 struct generic_stream_out *out = (struct generic_stream_out *)stream;
500 pthread_mutex_lock(&out->lock);
502 if (out->worker_standby) {
503 out->worker_standby = false;
509 get_current_output_position(out, ¤t_position, ¤t_time);
512 if (out->standby) {
513 out->standby = false;
514 out->underrun_time = current_time;
515 out->frames_rendered = 0;
516 out->frames_total_buffered = 0;
519 size_t frames_written = audio_vbuffer_write(&out->buffer, buffer, frames);
520 pthread_cond_signal(&out->worker_wake);
523 out->frames_written += frames;
524 out->frames_rendered += frames;
525 out->frames_total_buffered += frames;
532 int frames_sleep = out->frames_total_buffered < out->buffer.frame_count ? 0 : frames;
539 uint64_t time_since_last_write_us = now_us - out->last_write_time_us;
545 out->last_write_time_us = now_us + sleep_time_us;
547 pthread_mutex_unlock(&out->lock);
569 struct generic_stream_out *out = (struct generic_stream_out *)stream;
571 pthread_mutex_lock(&out->lock);
572 get_current_output_position(out, frames, timestamp);
573 pthread_mutex_unlock(&out->lock);
584 struct generic_stream_out *out = (struct generic_stream_out *)stream;
585 pthread_mutex_lock(&out->lock);
586 *dsp_frames = out->frames_rendered;
587 pthread_mutex_unlock(&out->lock);
591 // Must be called with out->lock held
592 static void do_out_standby(struct generic_stream_out *out)
596 if (out->standby) {
600 get_current_output_position(out, &out->underrun_position, NULL);
601 frames_sleep = out->frames_written - out->underrun_position;
608 out_get_sample_rate(&out->stream.common);
610 pthread_mutex_unlock(&out->lock);
612 pthread_mutex_lock(&out->lock);
614 out->worker_standby = true;
615 out->standby = true;
620 struct generic_stream_out *out = (struct generic_stream_out *)stream;
621 pthread_mutex_lock(&out->lock);
622 do_out_standby(out);
623 pthread_mutex_unlock(&out->lock);
1138 struct generic_stream_out *out;
1148 out = (struct generic_stream_out *)calloc(1, sizeof(struct generic_stream_out));
1150 if (!out)
1153 out->stream.common.get_sample_rate = out_get_sample_rate;
1154 out->stream.common.set_sample_rate = out_set_sample_rate;
1155 out->stream.common.get_buffer_size = out_get_buffer_size;
1156 out->stream.common.get_channels = out_get_channels;
1157 out->stream.common.get_format = out_get_format;
1158 out->stream.common.set_format = out_set_format;
1159 out->stream.common.standby = out_standby;
1160 out->stream.common.dump = out_dump;
1161 out->stream.common.set_parameters = out_set_parameters;
1162 out->stream.common.get_parameters = out_get_parameters;
1163 out->stream.common.add_audio_effect = out_add_audio_effect;
1164 out->stream.common.remove_audio_effect = out_remove_audio_effect;
1165 out->stream.get_latency = out_get_latency;
1166 out->stream.set_volume = out_set_volume;
1167 out->stream.write = out_write;
1168 out->stream.get_render_position = out_get_render_position;
1169 out->stream.get_presentation_position = out_get_presentation_position;
1170 out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
1172 pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL);
1173 out->dev = adev;
1174 out->device = devices;
1175 memcpy(&out->req_config, config, sizeof(struct audio_config));
1176 memcpy(&out->pcm_config, &pcm_config_out, sizeof(struct pcm_config));
1177 out->pcm_config.rate = config->sample_rate;
1178 out->pcm_config.period_size = out->pcm_config.rate*OUT_PERIOD_MS/1000;
1180 out->standby = true;
1181 out->underrun_position = 0;
1182 out->underrun_time.tv_sec = 0;
1183 out->underrun_time.tv_nsec = 0;
1184 out->last_write_time_us = 0;
1185 out->frames_total_buffered = 0;
1186 out->frames_written = 0;
1187 out->frames_rendered = 0;
1189 ret = audio_vbuffer_init(&out->buffer,
1190 out->pcm_config.period_size*out->pcm_config.period_count,
1191 out->pcm_config.channels *
1192 pcm_format_to_bits(out->pcm_config.format) >> 3);
1194 pthread_cond_init(&out->worker_wake, NULL);
1195 out->worker_standby = true;
1196 out->worker_exit = false;
1197 pthread_create(&out->worker_thread, NULL, out_write_worker, out);
1200 *stream_out = &out->stream;
1211 struct generic_stream_out *out = (struct generic_stream_out *)stream;
1212 pthread_mutex_lock(&out->lock);
1213 do_out_standby(out);
1215 out->worker_exit = true;
1216 pthread_cond_signal(&out->worker_wake);
1217 pthread_mutex_unlock(&out->lock);
1219 pthread_join(out->worker_thread, NULL);
1220 pthread_mutex_destroy(&out->lock);
1221 audio_vbuffer_destroy(&out->buffer);