~damg/ubuntu/quantal/asterisk/LP1097687

« back to all changes in this revision

Viewing changes to main/audiohook.c

  • Committer: Bazaar Package Importer
  • Author(s): Jean-Michel Dault
  • Date: 2010-02-16 14:08:54 UTC
  • mfrom: (1.2.5 upstream) (8.3.4 sid)
  • Revision ID: james.westby@ubuntu.com-20100216140854-rb2godspb9lduazl
Tags: 1:1.6.2.2-1ubuntu1
* Merge from Debian: security update
  * Changes:
  - debian/control: Change Maintainer
  - debian/control: Removed Uploaders field.
  - debian/control: Removed Debian Vcs-Svn entry and replaced with
      ubuntu-voip Vcs-Bzr, to reflect divergence in packages.
  - debian/asterisk.init : chown /dev/dahdi
  - debian/backports/hardy : add file
  - debian/backports/asterisk.init.hardy : add file

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
#include "asterisk.h"
27
27
 
28
 
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 197548 $")
 
28
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 230585 $")
29
29
 
30
30
#include <signal.h>
31
31
 
79
79
        }
80
80
 
81
81
        /* Since we are just starting out... this audiohook is new */
82
 
        audiohook->status = AST_AUDIOHOOK_STATUS_NEW;
 
82
        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_NEW);
83
83
 
84
84
        return 0;
85
85
}
351
351
                AST_LIST_INSERT_TAIL(&chan->audiohooks->manipulate_list, audiohook, list);
352
352
 
353
353
        /* Change status over to running since it is now attached */
354
 
        audiohook->status = AST_AUDIOHOOK_STATUS_RUNNING;
 
354
        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_RUNNING);
355
355
 
356
356
        ast_channel_unlock(chan);
357
357
 
358
358
        return 0;
359
359
}
360
360
 
 
361
/*! \brief Update audiohook's status
 
362
 * \param audiohook status enum
 
363
 * \param audiohook Audiohook structure
 
364
 */
 
365
void ast_audiohook_update_status(struct ast_audiohook *audiohook, enum ast_audiohook_status status)
 
366
{
 
367
        ast_audiohook_lock(audiohook);
 
368
        if (audiohook->status != AST_AUDIOHOOK_STATUS_DONE) {
 
369
                audiohook->status = status;
 
370
                ast_cond_signal(&audiohook->trigger);
 
371
        }
 
372
        ast_audiohook_unlock(audiohook);
 
373
}
 
374
 
361
375
/*! \brief Detach audiohook from channel
362
376
 * \param audiohook Audiohook structure
363
377
 * \return Returns 0 on success, -1 on failure
367
381
        if (audiohook->status == AST_AUDIOHOOK_STATUS_NEW || audiohook->status == AST_AUDIOHOOK_STATUS_DONE)
368
382
                return 0;
369
383
 
370
 
        audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
 
384
        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_SHUTDOWN);
371
385
 
372
386
        while (audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
373
387
                ast_audiohook_trigger_wait(audiohook);
386
400
 
387
401
        /* Drop any spies */
388
402
        while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->spy_list, list))) {
389
 
                ast_audiohook_lock(audiohook);
390
 
                audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
391
 
                ast_cond_signal(&audiohook->trigger);
392
 
                ast_audiohook_unlock(audiohook);
 
403
                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
393
404
        }
394
405
 
395
406
        /* Drop any whispering sources */
396
407
        while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->whisper_list, list))) {
397
 
                ast_audiohook_lock(audiohook);
398
 
                audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
399
 
                ast_cond_signal(&audiohook->trigger);
400
 
                ast_audiohook_unlock(audiohook);
 
408
                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
401
409
        }
402
410
 
403
411
        /* Drop any manipulaters */
404
412
        while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->manipulate_list, list))) {
405
 
                ast_audiohook_lock(audiohook);
406
 
                audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
407
 
                ast_audiohook_unlock(audiohook);
 
413
                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
408
414
                audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
409
415
        }
410
416
 
490
496
        ast_channel_unlock(chan);
491
497
 
492
498
        if (audiohook && audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
493
 
                audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
 
499
                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_SHUTDOWN);
494
500
 
495
501
        return (audiohook ? 0 : -1);
496
502
}
521
527
        else if (audiohook->type == AST_AUDIOHOOK_TYPE_MANIPULATE)
522
528
                AST_LIST_REMOVE(&chan->audiohooks->manipulate_list, audiohook, list);
523
529
 
524
 
        ast_audiohook_lock(audiohook);
525
 
        audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
526
 
        ast_cond_signal(&audiohook->trigger);
527
 
        ast_audiohook_unlock(audiohook);
 
530
        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
528
531
 
529
532
        ast_channel_unlock(chan);
530
533
 
546
549
                ast_audiohook_lock(audiohook);
547
550
                if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
548
551
                        AST_LIST_REMOVE_CURRENT(list);
549
 
                        audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
 
552
                        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
550
553
                        ast_audiohook_unlock(audiohook);
551
554
                        audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
552
555
                        continue;
574
577
        struct ast_frame *start_frame = frame, *middle_frame = frame, *end_frame = frame;
575
578
        struct ast_audiohook *audiohook = NULL;
576
579
        int samples = frame->samples;
577
 
        
 
580
 
578
581
        /* If the frame coming in is not signed linear we have to send it through the in_translate path */
579
582
        if (frame->subclass != AST_FORMAT_SLINEAR) {
580
583
                if (in_translate->format != frame->subclass) {
594
597
                ast_audiohook_lock(audiohook);
595
598
                if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
596
599
                        AST_LIST_REMOVE_CURRENT(list);
597
 
                        audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
598
 
                        ast_cond_signal(&audiohook->trigger);
 
600
                        ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
599
601
                        ast_audiohook_unlock(audiohook);
600
602
                        continue;
601
603
                }
613
615
                        ast_audiohook_lock(audiohook);
614
616
                        if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
615
617
                                AST_LIST_REMOVE_CURRENT(list);
616
 
                                audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
617
 
                                ast_cond_signal(&audiohook->trigger);
 
618
                                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
618
619
                                ast_audiohook_unlock(audiohook);
619
620
                                continue;
620
621
                        }
638
639
                        ast_audiohook_lock(audiohook);
639
640
                        if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
640
641
                                AST_LIST_REMOVE_CURRENT(list);
641
 
                                audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
 
642
                                ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
642
643
                                ast_audiohook_unlock(audiohook);
643
644
                                /* We basically drop all of our links to the manipulate audiohook and prod it to do it's own destructive things */
644
645
                                audiohook->manipulate_callback(audiohook, chan, NULL, direction);
645
646
                                continue;
646
647
                        }
647
648
                        /* Feed in frame to manipulation */
648
 
                        audiohook->manipulate_callback(audiohook, chan, middle_frame, direction);
 
649
                        if (audiohook->manipulate_callback(audiohook, chan, middle_frame, direction)) {
 
650
                                ast_frfree(middle_frame);
 
651
                                middle_frame = NULL;
 
652
                        }
649
653
                        ast_audiohook_unlock(audiohook);
650
654
                }
651
655
                AST_LIST_TRAVERSE_SAFE_END;
652
 
                end_frame = middle_frame;
 
656
                if (middle_frame) {
 
657
                        end_frame = middle_frame;
 
658
                }
653
659
        }
654
660
 
655
661
        /* Now we figure out what to do with our end frame (whether to transcode or not) */
677
683
                }
678
684
        } else {
679
685
                /* No frame was modified, we can just drop our middle frame and pass the frame we got in out */
680
 
                ast_frfree(middle_frame);
 
686
                if (middle_frame) {
 
687
                        ast_frfree(middle_frame);
 
688
                }
681
689
        }
682
690
 
683
691
        return end_frame;