static void recording_set_state(struct stasis_app_recording *recording,
				enum stasis_app_recording_state state,
				const char *cause)
{
	SCOPED_AO2LOCK(lock, recording);
	recording->state = state;
	recording_publish(recording, cause);
}
Exemplo n.º 2
0
static void *record_file(struct stasis_app_control *control,
	struct ast_channel *chan, void *data)
{
	RAII_VAR(struct stasis_app_recording *, recording,
		NULL, recording_cleanup);
	char *acceptdtmf;
	int res;
	int duration = 0;

	recording = data;
	ast_assert(recording != NULL);

	if (stasis_app_get_bridge(control)) {
		ast_log(LOG_ERROR, "Cannot record channel while in bridge\n");
		recording_fail(recording);
		return NULL;
	}

	switch (recording->options->terminate_on) {
	case STASIS_APP_RECORDING_TERMINATE_NONE:
	case STASIS_APP_RECORDING_TERMINATE_INVALID:
		acceptdtmf = "";
		break;
	case STASIS_APP_RECORDING_TERMINATE_ANY:
		acceptdtmf = "#*0123456789abcd";
		break;
	default:
		acceptdtmf = ast_alloca(2);
		acceptdtmf[0] = recording->options->terminate_on;
		acceptdtmf[1] = '\0';
	}

	res = ast_auto_answer(chan);
	if (res != 0) {
		ast_debug(3, "%s: Failed to answer\n",
			ast_channel_uniqueid(chan));
		recording_fail(recording);
		return NULL;
	}

	ao2_lock(recording);
	recording->state = STASIS_APP_RECORDING_STATE_RECORDING;
	recording_publish(recording);
	ao2_unlock(recording);

	ast_play_and_record_full(chan,
		NULL, /* playfile */
		recording->absolute_name,
		recording->options->max_duration_seconds,
		recording->options->format,
		&duration,
		NULL, /* sound_duration */
		recording->options->beep,
		-1, /* silencethreshold */
		recording->options->max_silence_seconds * 1000,
		NULL, /* path */
		acceptdtmf,
		NULL, /* canceldtmf */
		1, /* skip_confirmation_sound */
		recording->options->if_exists);

	ast_debug(3, "%s: Recording complete\n", ast_channel_uniqueid(chan));

	ao2_lock(recording);
	recording->state = STASIS_APP_RECORDING_STATE_COMPLETE;
	recording_publish(recording);
	ao2_unlock(recording);

	return NULL;
}
Exemplo n.º 3
0
static void recording_fail(struct stasis_app_recording *recording)
{
	SCOPED_AO2LOCK(lock, recording);
	recording->state = STASIS_APP_RECORDING_STATE_FAILED;
	recording_publish(recording);
}