Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

История изменений [назад]

нажмите, чтобы скрыть/показать версии 1
изначальная версия
редактировать

ответил 2012-04-25 15:33:23 +0400

champion Gravatar champion

Действо происходит в этой функции. Обращение к файлу идет только после astaudiohookreadframe, как показано в коде. Т.е. косяк на уровне этой функции. static void *mixmonitorthread(void obj) { struct mixmonitor *mixmonitor = obj; struct ast_filestream *fs = NULL; unsigned int oflags; char *ext; int errflag = 0;

        ast_verb(2, "Begin MixMonitor Recording %s\n", mixmonitor->name);

        fs = &mixmonitor->mixmonitor_ds->fs;

        /* The audiohook must enter and exit the loop locked */
        ast_audiohook_lock(&mixmonitor->audiohook);

        while (mixmonitor->audiohook.status == AST_AUDIOHOOK_STATUS_RUNNING && !mixmonitor->mixmonitor_ds->fs_quit) {
                struct ast_frame *fr = NULL;
                /* Вызов ast_audiohook_read_frame когда обращение к файлу дальше. Т.е. валиться при начале чтения фрейма и не имеет  значения файл */
                if (!(fr = ast_audiohook_read_frame(&mixmonitor->audiohook, SAMPLES_PER_FRAME, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR))) {
                        ast_audiohook_trigger_wait(&mixmonitor->audiohook);

                        if (mixmonitor->audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
                                break;
                        }
                        continue;
                }

                /* audiohook lock is not required for the next block.
                 * Unlock it, but remember to lock it before looping or exiting */
                ast_audiohook_unlock(&mixmonitor->audiohook);

                if (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) || (mixmonitor->autochan->chan && ast_bridged_channel(mixmonitor->autochan->chan))) {
                        ast_mutex_lock(&mixmonitor->mixmonitor_ds->lock);
                        /* Initialize the file if not already done so */
                        if (!*fs && !errflag && !mixmonitor->mixmonitor_ds->fs_quit) {
                                oflags = O_CREAT | O_WRONLY;
                                oflags |= ast_test_flag(mixmonitor, MUXFLAG_APPEND) ? O_APPEND : O_TRUNC;

                                if ((ext = strrchr(mixmonitor->filename, '.')))
                                        *(ext++) = '\0';
                                else
                                        ext = "raw";

                                if (!(*fs = ast_writefile(mixmonitor->filename, ext, NULL, oflags, 0, 0666))) {
                                        ast_log(LOG_ERROR, "Cannot open %s.%s\n", mixmonitor->filename, ext);

Действо происходит в этой функции. Обращение к файлу идет только после astaudiohookreadframe, read_frame, как показано в коде. Т.е. косяк на уровне этой функции.

static void *mixmonitorthread(void obj)
    *mixmonitor_thread(void *obj)
{
         struct mixmonitor *mixmonitor = obj;
         struct ast_filestream *fs **fs = NULL;
         unsigned int oflags;
         char *ext;
         int errflag = 0;

0;

        ast_verb(2, "Begin MixMonitor Recording %s\n", mixmonitor->name);

        fs = &mixmonitor->mixmonitor_ds->fs;

        /* The audiohook must enter and exit the loop locked */
        ast_audiohook_lock(&mixmonitor->audiohook);

        while (mixmonitor->audiohook.status == AST_AUDIOHOOK_STATUS_RUNNING && !mixmonitor->mixmonitor_ds->fs_quit) {
                struct ast_frame *fr = NULL;
                /* Вызов ast_audiohook_read_frame когда обращение к файлу дальше. Т.е. валиться при начале чтения фрейма и не имеет  значения файл */
                if (!(fr = ast_audiohook_read_frame(&mixmonitor->audiohook, SAMPLES_PER_FRAME, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR))) {
                        ast_audiohook_trigger_wait(&mixmonitor->audiohook);

                        if (mixmonitor->audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
                                break;
                        }
                        continue;
                }

                /* audiohook lock is not required for the next block.
                 * Unlock it, but remember to lock it before looping or exiting */
                ast_audiohook_unlock(&mixmonitor->audiohook);

                if (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) || (mixmonitor->autochan->chan && ast_bridged_channel(mixmonitor->autochan->chan))) {
                        ast_mutex_lock(&mixmonitor->mixmonitor_ds->lock);
                        /* Initialize the file if not already done so */
                        if (!*fs && !errflag && !mixmonitor->mixmonitor_ds->fs_quit) {
                                oflags = O_CREAT | O_WRONLY;
                                oflags |= ast_test_flag(mixmonitor, MUXFLAG_APPEND) ? O_APPEND : O_TRUNC;

                                if ((ext = strrchr(mixmonitor->filename, '.')))
                                        *(ext++) = '\0';
                                else
                                        ext = "raw";

                                if (!(*fs = ast_writefile(mixmonitor->filename, ext, NULL, oflags, 0, 0666))) {
                                        ast_log(LOG_ERROR, "Cannot open %s.%s\n", mixmonitor->filename, ext);

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.