Mon Mar 31 07:39:06 2008

Asterisk developer's documentation


audiohook.h File Reference

Audiohooks Architecture. More...

#include "asterisk/slinfactory.h"

Include dependency graph for audiohook.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_audiohook
struct  ast_audiohook_options

Defines

#define ast_audiohook_lock(ah)   ast_mutex_lock(&(ah)->lock)
 Lock an audiohook.
#define ast_audiohook_unlock(ah)   ast_mutex_unlock(&(ah)->lock)
 Unlock an audiohook.

Typedefs

typedef int(*) ast_audiohook_manipulate_callback (struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)
 Callback function for manipulate audiohook type.

Enumerations

enum  ast_audiohook_direction { AST_AUDIOHOOK_DIRECTION_READ = 0, AST_AUDIOHOOK_DIRECTION_WRITE, AST_AUDIOHOOK_DIRECTION_BOTH }
enum  ast_audiohook_flags {
  AST_AUDIOHOOK_TRIGGER_MODE = (3 << 0), AST_AUDIOHOOK_TRIGGER_READ = (1 << 0), AST_AUDIOHOOK_TRIGGER_WRITE = (2 << 0), AST_AUDIOHOOK_WANTS_DTMF = (1 << 1),
  AST_AUDIOHOOK_TRIGGER_SYNC = (1 << 2)
}
enum  ast_audiohook_status { AST_AUDIOHOOK_STATUS_NEW = 0, AST_AUDIOHOOK_STATUS_RUNNING, AST_AUDIOHOOK_STATUS_SHUTDOWN, AST_AUDIOHOOK_STATUS_DONE }
enum  ast_audiohook_type { AST_AUDIOHOOK_TYPE_SPY = 0, AST_AUDIOHOOK_TYPE_WHISPER, AST_AUDIOHOOK_TYPE_MANIPULATE }

Functions

int ast_audiohook_attach (struct ast_channel *chan, struct ast_audiohook *audiohook)
 Attach audiohook to channel.
int ast_audiohook_destroy (struct ast_audiohook *audiohook)
 Destroys an audiohook structure.
int ast_audiohook_detach (struct ast_audiohook *audiohook)
 Detach audiohook from channel.
int ast_audiohook_detach_list (struct ast_audiohook_list *audiohook_list)
 Detach audiohooks from list and destroy said list.
int ast_audiohook_detach_source (struct ast_channel *chan, const char *source)
 Detach specified source audiohook from channel.
int ast_audiohook_init (struct ast_audiohook *audiohook, enum ast_audiohook_type type, const char *source)
 Initialize an audiohook structure.
ast_frameast_audiohook_read_frame (struct ast_audiohook *audiohook, size_t samples, enum ast_audiohook_direction direction, int format)
 Reads a frame in from the audiohook structure.
void ast_audiohook_trigger_wait (struct ast_audiohook *audiohook)
 Wait for audiohook trigger to be triggered.
int ast_audiohook_write_frame (struct ast_audiohook *audiohook, enum ast_audiohook_direction direction, struct ast_frame *frame)
 Writes a frame into the audiohook structure.
ast_frameast_audiohook_write_list (struct ast_channel *chan, struct ast_audiohook_list *audiohook_list, enum ast_audiohook_direction direction, struct ast_frame *frame)
 Pass a frame off to be handled by the audiohook core.


Detailed Description

Audiohooks Architecture.

Definition in file audiohook.h.


Define Documentation

#define ast_audiohook_lock ( ah   )     ast_mutex_lock(&(ah)->lock)

Lock an audiohook.

Parameters:
ah Audiohook structure

Definition at line 171 of file audiohook.h.

Referenced by ast_audiohook_detach_list(), audio_audiohook_write_list(), channel_spy(), dtmf_audiohook_write_list(), mixmonitor_thread(), and spy_generate().

#define ast_audiohook_unlock ( ah   )     ast_mutex_unlock(&(ah)->lock)

Unlock an audiohook.

Parameters:
ah Audiohook structure

Definition at line 176 of file audiohook.h.

Referenced by ast_audiohook_detach_list(), audio_audiohook_write_list(), channel_spy(), dtmf_audiohook_write_list(), mixmonitor_thread(), and spy_generate().


Typedef Documentation

typedef int(*) ast_audiohook_manipulate_callback(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction)

Callback function for manipulate audiohook type.

Parameters:
audiohook Audiohook structure
chan Channel
frame Frame of audio to manipulate
direction Direction frame came from
Returns:
Returns 0 on success, -1 on failure
Note:
An audiohook does not have any reference to a private data structure for manipulate types. It is up to the manipulate callback to store this data via it's own method. An example would be datastores.

Definition at line 70 of file audiohook.h.


Enumeration Type Documentation

enum ast_audiohook_direction

Enumerator:
AST_AUDIOHOOK_DIRECTION_READ  Reading audio in
AST_AUDIOHOOK_DIRECTION_WRITE  Writing audio out
AST_AUDIOHOOK_DIRECTION_BOTH  Both reading audio in and writing audio out

Definition at line 45 of file audiohook.h.

00045                              {
00046    AST_AUDIOHOOK_DIRECTION_READ = 0, /*!< Reading audio in */
00047    AST_AUDIOHOOK_DIRECTION_WRITE,    /*!< Writing audio out */
00048    AST_AUDIOHOOK_DIRECTION_BOTH,     /*!< Both reading audio in and writing audio out */
00049 };

enum ast_audiohook_flags

Enumerator:
AST_AUDIOHOOK_TRIGGER_MODE  When audiohook should be triggered to do something
AST_AUDIOHOOK_TRIGGER_READ  Audiohook wants to be triggered when reading audio in
AST_AUDIOHOOK_TRIGGER_WRITE  Audiohook wants to be triggered when writing audio out
AST_AUDIOHOOK_WANTS_DTMF  Audiohook also wants to receive DTMF frames
AST_AUDIOHOOK_TRIGGER_SYNC  Audiohook wants to be triggered when both sides have combined audio available

Definition at line 51 of file audiohook.h.

00051                          {
00052    AST_AUDIOHOOK_TRIGGER_MODE = (3 << 0),  /*!< When audiohook should be triggered to do something */
00053    AST_AUDIOHOOK_TRIGGER_READ = (1 << 0),  /*!< Audiohook wants to be triggered when reading audio in */
00054    AST_AUDIOHOOK_TRIGGER_WRITE = (2 << 0), /*!< Audiohook wants to be triggered when writing audio out */
00055    AST_AUDIOHOOK_WANTS_DTMF = (1 << 1),    /*!< Audiohook also wants to receive DTMF frames */
00056    AST_AUDIOHOOK_TRIGGER_SYNC = (1 << 2),  /*!< Audiohook wants to be triggered when both sides have combined audio available */
00057 };

enum ast_audiohook_status

Enumerator:
AST_AUDIOHOOK_STATUS_NEW  Audiohook was just created, not in use yet
AST_AUDIOHOOK_STATUS_RUNNING  Audiohook is running on a channel
AST_AUDIOHOOK_STATUS_SHUTDOWN  Audiohook is being shutdown
AST_AUDIOHOOK_STATUS_DONE  Audiohook has shutdown and is not running on a channel any longer

Definition at line 38 of file audiohook.h.

00038                           {
00039    AST_AUDIOHOOK_STATUS_NEW = 0,  /*!< Audiohook was just created, not in use yet */
00040    AST_AUDIOHOOK_STATUS_RUNNING,  /*!< Audiohook is running on a channel */
00041    AST_AUDIOHOOK_STATUS_SHUTDOWN, /*!< Audiohook is being shutdown */
00042    AST_AUDIOHOOK_STATUS_DONE,     /*!< Audiohook has shutdown and is not running on a channel any longer */
00043 };

enum ast_audiohook_type

Enumerator:
AST_AUDIOHOOK_TYPE_SPY  Audiohook wants to receive audio
AST_AUDIOHOOK_TYPE_WHISPER  Audiohook wants to provide audio to be mixed with existing audio
AST_AUDIOHOOK_TYPE_MANIPULATE  Audiohook wants to manipulate the audio

Definition at line 32 of file audiohook.h.

00032                         {
00033    AST_AUDIOHOOK_TYPE_SPY = 0,    /*!< Audiohook wants to receive audio */
00034    AST_AUDIOHOOK_TYPE_WHISPER,    /*!< Audiohook wants to provide audio to be mixed with existing audio */
00035    AST_AUDIOHOOK_TYPE_MANIPULATE, /*!< Audiohook wants to manipulate the audio */
00036 };


Function Documentation

int ast_audiohook_attach ( struct ast_channel chan,
struct ast_audiohook audiohook 
)

Attach audiohook to channel.

Parameters:
chan Channel
audiohook Audiohook structure
Returns:
Returns 0 on success, -1 on failure

Definition at line 315 of file audiohook.c.

References AST_AUDIOHOOK_STATUS_RUNNING, AST_AUDIOHOOK_TYPE_MANIPULATE, AST_AUDIOHOOK_TYPE_SPY, AST_AUDIOHOOK_TYPE_WHISPER, ast_calloc, ast_channel_lock, ast_channel_unlock, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_INSERT_TAIL, ast_channel::audiohooks, ast_audiohook::status, and ast_audiohook::type.

Referenced by start_spying(), and startmon().

00316 {
00317    ast_channel_lock(chan);
00318 
00319    if (!chan->audiohooks) {
00320       /* Whoops... allocate a new structure */
00321       if (!(chan->audiohooks = ast_calloc(1, sizeof(*chan->audiohooks)))) {
00322          ast_channel_unlock(chan);
00323          return -1;
00324       }
00325       AST_LIST_HEAD_INIT_NOLOCK(&chan->audiohooks->spy_list);
00326       AST_LIST_HEAD_INIT_NOLOCK(&chan->audiohooks->whisper_list);
00327       AST_LIST_HEAD_INIT_NOLOCK(&chan->audiohooks->manipulate_list);
00328    }
00329 
00330    /* Drop into respective list */
00331    if (audiohook->type == AST_AUDIOHOOK_TYPE_SPY)
00332       AST_LIST_INSERT_TAIL(&chan->audiohooks->spy_list, audiohook, list);
00333    else if (audiohook->type == AST_AUDIOHOOK_TYPE_WHISPER)
00334       AST_LIST_INSERT_TAIL(&chan->audiohooks->whisper_list, audiohook, list);
00335    else if (audiohook->type == AST_AUDIOHOOK_TYPE_MANIPULATE)
00336       AST_LIST_INSERT_TAIL(&chan->audiohooks->manipulate_list, audiohook, list);
00337 
00338    /* Change status over to running since it is now attached */
00339    audiohook->status = AST_AUDIOHOOK_STATUS_RUNNING;
00340 
00341    ast_channel_unlock(chan);
00342 
00343    return 0;
00344 }

int ast_audiohook_destroy ( struct ast_audiohook audiohook  ) 

Destroys an audiohook structure.

Parameters:
audiohook Audiohook structure
Returns:
Returns 0 on success, -1 on failure

Definition at line 98 of file audiohook.c.

References AST_AUDIOHOOK_TYPE_SPY, AST_AUDIOHOOK_TYPE_WHISPER, ast_cond_destroy(), ast_mutex_destroy(), ast_slinfactory_destroy(), ast_translator_free_path(), ast_audiohook::lock, ast_audiohook::read_factory, ast_audiohook::trans_pvt, ast_audiohook::trigger, ast_audiohook::type, and ast_audiohook::write_factory.

Referenced by channel_spy(), launch_monitor_thread(), and mixmonitor_thread().

00099 {
00100    /* Drop the factories used by this audiohook type */
00101    switch (audiohook->type) {
00102    case AST_AUDIOHOOK_TYPE_SPY:
00103       ast_slinfactory_destroy(&audiohook->read_factory);
00104    case AST_AUDIOHOOK_TYPE_WHISPER:
00105       ast_slinfactory_destroy(&audiohook->write_factory);
00106       break;
00107    default:
00108       break;
00109    }
00110 
00111    /* Destroy translation path if present */
00112    if (audiohook->trans_pvt)
00113       ast_translator_free_path(audiohook->trans_pvt);
00114 
00115    /* Lock and trigger be gone! */
00116    ast_cond_destroy(&audiohook->trigger);
00117    ast_mutex_destroy(&audiohook->lock);
00118 
00119    return 0;
00120 }

int ast_audiohook_detach ( struct ast_audiohook audiohook  ) 

Detach audiohook from channel.

Parameters:
audiohook Audiohook structure
Returns:
Returns 0 on success, -1 on failure

Definition at line 350 of file audiohook.c.

References AST_AUDIOHOOK_STATUS_DONE, AST_AUDIOHOOK_STATUS_SHUTDOWN, ast_audiohook_trigger_wait(), and ast_audiohook::status.

Referenced by channel_spy(), and mixmonitor_thread().

00351 {
00352    if (audiohook->status == AST_AUDIOHOOK_STATUS_DONE)
00353       return 0;
00354 
00355    audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
00356 
00357    while (audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
00358       ast_audiohook_trigger_wait(audiohook);
00359 
00360    return 0;
00361 }

int ast_audiohook_detach_list ( struct ast_audiohook_list audiohook_list  ) 

Detach audiohooks from list and destroy said list.

Parameters:
audiohook_list List of audiohooks
Returns:
Returns 0 on success, -1 on failure

Definition at line 367 of file audiohook.c.

References ast_audiohook_lock, AST_AUDIOHOOK_STATUS_DONE, ast_audiohook_unlock, ast_cond_signal(), ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_translator_free_path(), ast_audiohook_list::in_translate, ast_audiohook::manipulate_callback, ast_audiohook_list::out_translate, ast_audiohook::status, ast_audiohook_translate::trans_pvt, and ast_audiohook::trigger.

Referenced by ast_hangup().

00368 {
00369    int i = 0;
00370    struct ast_audiohook *audiohook = NULL;
00371 
00372    /* Drop any spies */
00373    AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->spy_list, audiohook, list) {
00374       ast_audiohook_lock(audiohook);
00375       AST_LIST_REMOVE_CURRENT(&audiohook_list->spy_list, list);
00376       audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
00377       ast_cond_signal(&audiohook->trigger);
00378       ast_audiohook_unlock(audiohook);
00379    }
00380    AST_LIST_TRAVERSE_SAFE_END
00381 
00382    /* Drop any whispering sources */
00383    AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->whisper_list, audiohook, list) {
00384       ast_audiohook_lock(audiohook);
00385       AST_LIST_REMOVE_CURRENT(&audiohook_list->whisper_list, list);
00386       audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
00387       ast_cond_signal(&audiohook->trigger);
00388       ast_audiohook_unlock(audiohook);
00389    }
00390    AST_LIST_TRAVERSE_SAFE_END
00391 
00392    /* Drop any manipulaters */
00393    AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) {
00394       ast_audiohook_lock(audiohook);
00395       AST_LIST_REMOVE_CURRENT(&audiohook_list->manipulate_list, list);
00396       audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
00397       ast_audiohook_unlock(audiohook);
00398       audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
00399    }
00400    AST_LIST_TRAVERSE_SAFE_END
00401 
00402    /* Drop translation paths if present */
00403    for (i = 0; i < 2; i++) {
00404       if (audiohook_list->in_translate[i].trans_pvt)
00405          ast_translator_free_path(audiohook_list->in_translate[i].trans_pvt);
00406       if (audiohook_list->out_translate[i].trans_pvt)
00407          ast_translator_free_path(audiohook_list->out_translate[i].trans_pvt);
00408    }
00409    
00410    /* Free ourselves */
00411    ast_free(audiohook_list);
00412 
00413    return 0;
00414 }

int ast_audiohook_detach_source ( struct ast_channel chan,
const char *  source 
)

Detach specified source audiohook from channel.

Parameters:
chan Channel to detach from
source Name of source to detach
Returns:
Returns 0 on success, -1 on failure

Definition at line 443 of file audiohook.c.

References AST_AUDIOHOOK_STATUS_DONE, AST_AUDIOHOOK_STATUS_SHUTDOWN, ast_channel_lock, ast_channel_unlock, ast_channel::audiohooks, find_audiohook_by_source(), and ast_audiohook::status.

Referenced by mixmonitor_cli(), and stop_mixmonitor_exec().

00444 {
00445    struct ast_audiohook *audiohook = NULL;
00446 
00447    ast_channel_lock(chan);
00448 
00449    /* Ensure the channel has audiohooks on it */
00450    if (!chan->audiohooks) {
00451       ast_channel_unlock(chan);
00452       return -1;
00453    }
00454 
00455    audiohook = find_audiohook_by_source(chan->audiohooks, source);
00456 
00457    ast_channel_unlock(chan);
00458 
00459    if (audiohook && audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
00460       audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
00461 
00462    return (audiohook ? 0 : -1);
00463 }

int ast_audiohook_init ( struct ast_audiohook audiohook,
enum ast_audiohook_type  type,
const char *  source 
)

Initialize an audiohook structure.

Parameters:
audiohook Audiohook structure
type 
source 
Returns:
Returns 0 on success, -1 on failure

Definition at line 67 of file audiohook.c.

References AST_AUDIOHOOK_STATUS_NEW, AST_AUDIOHOOK_TYPE_SPY, AST_AUDIOHOOK_TYPE_WHISPER, ast_cond_init(), ast_mutex_init(), and ast_slinfactory_init().

Referenced by channel_spy(), and launch_monitor_thread().

00068 {
00069    /* Need to keep the type and source */
00070    audiohook->type = type;
00071    audiohook->source = source;
00072 
00073    /* Initialize lock that protects our audiohook */
00074    ast_mutex_init(&audiohook->lock);
00075    ast_cond_init(&audiohook->trigger, NULL);
00076 
00077    /* Setup the factories that are needed for this audiohook type */
00078    switch (type) {
00079    case AST_AUDIOHOOK_TYPE_SPY:
00080       ast_slinfactory_init(&audiohook->read_factory);
00081    case AST_AUDIOHOOK_TYPE_WHISPER:
00082       ast_slinfactory_init(&audiohook->write_factory);
00083       break;
00084    default:
00085       break;
00086    }
00087 
00088    /* Since we are just starting out... this audiohook is new */
00089    audiohook->status = AST_AUDIOHOOK_STATUS_NEW;
00090 
00091    return 0;
00092 }

struct ast_frame* ast_audiohook_read_frame ( struct ast_audiohook audiohook,
size_t  samples,
enum ast_audiohook_direction  direction,
int  format 
)

Reads a frame in from the audiohook structure.

Parameters:
audiohook Audiohook structure
samples Number of samples wanted
direction Direction the audio frame came from
format Format of frame remote side wants back
Returns:
Returns frame on success, NULL on failure

Definition at line 280 of file audiohook.c.

References AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR, ast_frfree, ast_translate(), ast_translator_build_path(), ast_translator_free_path(), audiohook_read_frame_both(), and audiohook_read_frame_single().

Referenced by mixmonitor_thread(), and spy_generate().

00281 {
00282    struct ast_frame *read_frame = NULL, *final_frame = NULL;
00283 
00284    if (!(read_frame = (direction == AST_AUDIOHOOK_DIRECTION_BOTH ? audiohook_read_frame_both(audiohook, samples) : audiohook_read_frame_single(audiohook, samples, direction))))
00285       return NULL;
00286 
00287    /* If they don't want signed linear back out, we'll have to send it through the translation path */
00288    if (format != AST_FORMAT_SLINEAR) {
00289       /* Rebuild translation path if different format then previously */
00290       if (audiohook->format != format) {
00291          if (audiohook->trans_pvt) {
00292             ast_translator_free_path(audiohook->trans_pvt);
00293             audiohook->trans_pvt = NULL;
00294          }
00295          /* Setup new translation path for this format... if we fail we can't very well return signed linear so free the frame and return nothing */
00296          if (!(audiohook->trans_pvt = ast_translator_build_path(format, AST_FORMAT_SLINEAR))) {
00297             ast_frfree(read_frame);
00298             return NULL;
00299          }
00300       }
00301       /* Convert to requested format, and allow the read in frame to be freed */
00302       final_frame = ast_translate(audiohook->trans_pvt, read_frame, 1);
00303    } else {
00304       final_frame = read_frame;
00305    }
00306 
00307    return final_frame;
00308 }

void ast_audiohook_trigger_wait ( struct ast_audiohook audiohook  ) 

Wait for audiohook trigger to be triggered.

Parameters:
audiohook Audiohook to wait on

Definition at line 638 of file audiohook.c.

References ast_cond_timedwait(), ast_tvadd(), ast_audiohook::lock, and ast_audiohook::trigger.

Referenced by ast_audiohook_detach(), and mixmonitor_thread().

00639 {
00640    struct timeval tv;
00641    struct timespec ts;
00642 
00643    tv = ast_tvadd(ast_tvnow(), ast_samp2tv(50000, 1000));
00644    ts.tv_sec = tv.tv_sec;
00645    ts.tv_nsec = tv.tv_usec * 1000;
00646    
00647    ast_cond_timedwait(&audiohook->trigger, &audiohook->lock, &ts);
00648    
00649    return;
00650 }

int ast_audiohook_write_frame ( struct ast_audiohook audiohook,
enum ast_audiohook_direction  direction,
struct ast_frame frame 
)

Writes a frame into the audiohook structure.

Parameters:
audiohook Audiohook structure
direction Direction the audio frame came from
frame Frame to write in
Returns:
Returns 0 on success, -1 on failure

Definition at line 128 of file audiohook.c.

References AST_AUDIOHOOK_DIRECTION_READ, AST_AUDIOHOOK_DIRECTION_WRITE, AST_AUDIOHOOK_TRIGGER_MODE, AST_AUDIOHOOK_TRIGGER_READ, AST_AUDIOHOOK_TRIGGER_SYNC, AST_AUDIOHOOK_TRIGGER_WRITE, ast_cond_signal(), ast_slinfactory_feed(), ast_test_flag, ast_audiohook::read_factory, ast_audiohook::read_time, ast_audiohook::trigger, ast_audiohook::write_factory, and ast_audiohook::write_time.

Referenced by audio_audiohook_write_list(), and channel_spy().

00129 {
00130    struct ast_slinfactory *factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_factory : &audiohook->write_factory);
00131    struct timeval *time = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_time : &audiohook->write_time);
00132 
00133    /* Write frame out to respective factory */
00134    ast_slinfactory_feed(factory, frame);
00135 
00136    /* Update last fed time for the above factory */
00137    *time = ast_tvnow();
00138 
00139    /* If we need to notify the respective handler of this audiohook, do so */
00140    if ((ast_test_flag(audiohook, AST_AUDIOHOOK_TRIGGER_MODE) == AST_AUDIOHOOK_TRIGGER_READ) && (direction == AST_AUDIOHOOK_DIRECTION_READ)) {
00141       ast_cond_signal(&audiohook->trigger);
00142    } else if ((ast_test_flag(audiohook, AST_AUDIOHOOK_TRIGGER_MODE) == AST_AUDIOHOOK_TRIGGER_WRITE) && (direction == AST_AUDIOHOOK_DIRECTION_WRITE)) {
00143       ast_cond_signal(&audiohook->trigger);
00144    } else if (ast_test_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC)) {
00145       ast_cond_signal(&audiohook->trigger);
00146    }
00147 
00148    return 0;
00149 }

struct ast_frame* ast_audiohook_write_list ( struct ast_channel chan,
struct ast_audiohook_list audiohook_list,
enum ast_audiohook_direction  direction,
struct ast_frame frame 
)

Pass a frame off to be handled by the audiohook core.

Parameters:
chan Channel that the list is coming off of
audiohook_list List of audiohooks
direction Direction frame is coming in from
frame The frame itself
Returns:
Return frame on success, NULL on failure

Definition at line 623 of file audiohook.c.

References AST_FRAME_DTMF, AST_FRAME_VOICE, audio_audiohook_write_list(), dtmf_audiohook_write_list(), and ast_frame::frametype.

Referenced by __ast_read(), and ast_write().

00624 {
00625    /* Pass off frame to it's respective list write function */
00626    if (frame->frametype == AST_FRAME_VOICE)
00627       return audio_audiohook_write_list(chan, audiohook_list, direction, frame);
00628    else if (frame->frametype == AST_FRAME_DTMF)
00629       return dtmf_audiohook_write_list(chan, audiohook_list, direction, frame);
00630    else
00631       return frame;
00632 }


Generated on Mon Mar 31 07:39:06 2008 for Asterisk - the Open Source PBX by  doxygen 1.5.1