@ -8772,37 +8772,50 @@ static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int
static int dahdi_write ( struct ast_channel * ast , struct ast_frame * frame )
static int dahdi_write ( struct ast_channel * ast , struct ast_frame * frame )
{
{
struct dahdi_pvt * p = ast_channel_tech_pvt ( ast ) ;
struct dahdi_pvt * p ;
int res ;
int res ;
int idx ;
int idx ;
/* Write a frame of (presumably voice) data */
if ( frame - > frametype ! = AST_FRAME_VOICE ) {
if ( frame - > frametype ! = AST_FRAME_IMAGE ) {
ast_log ( LOG_WARNING , " Don't know what to do with frame type '%u' \n " ,
frame - > frametype ) ;
}
return 0 ;
}
/* Return if it's not valid data */
if ( ! frame - > data . ptr | | ! frame - > datalen ) {
return 0 ;
}
p = ast_channel_tech_pvt ( ast ) ;
ast_mutex_lock ( & p - > lock ) ;
idx = dahdi_get_index ( ast , p , 0 ) ;
idx = dahdi_get_index ( ast , p , 0 ) ;
if ( idx < 0 ) {
if ( idx < 0 ) {
ast_mutex_unlock ( & p - > lock ) ;
ast_log ( LOG_WARNING , " %s doesn't really exist? \n " , ast_channel_name ( ast ) ) ;
ast_log ( LOG_WARNING , " %s doesn't really exist? \n " , ast_channel_name ( ast ) ) ;
return - 1 ;
return - 1 ;
}
}
/* Write a frame of (presumably voice) data */
if ( frame - > frametype ! = AST_FRAME_VOICE ) {
if ( frame - > frametype ! = AST_FRAME_IMAGE )
ast_log ( LOG_WARNING , " Don't know what to do with frame type '%u' \n " , frame - > frametype ) ;
return 0 ;
}
if ( p - > dialing ) {
if ( p - > dialing ) {
ast_mutex_unlock ( & p - > lock ) ;
ast_debug ( 5 , " Dropping frame since I'm still dialing on %s... \n " , ast_channel_name ( ast ) ) ;
ast_debug ( 5 , " Dropping frame since I'm still dialing on %s... \n " , ast_channel_name ( ast ) ) ;
return 0 ;
return 0 ;
}
}
if ( ! p - > owner ) {
if ( ! p - > owner ) {
ast_mutex_unlock ( & p - > lock ) ;
ast_debug ( 5 , " Dropping frame since there is no active owner on %s... \n " , ast_channel_name ( ast ) ) ;
ast_debug ( 5 , " Dropping frame since there is no active owner on %s... \n " , ast_channel_name ( ast ) ) ;
return 0 ;
return 0 ;
}
}
if ( p - > cidspill ) {
if ( p - > cidspill ) {
ast_mutex_unlock ( & p - > lock ) ;
ast_debug ( 5 , " Dropping frame since I've still got a callerid spill on %s... \n " ,
ast_debug ( 5 , " Dropping frame since I've still got a callerid spill on %s... \n " ,
ast_channel_name ( ast ) ) ;
ast_channel_name ( ast ) ) ;
return 0 ;
return 0 ;
}
}
/* Return if it's not valid data */
if ( ! frame - > data . ptr | | ! frame - > datalen )
return 0 ;
if ( ast_format_cmp ( frame - > subclass . format , ast_format_slin ) = = AST_FORMAT_CMP_EQUAL ) {
if ( ast_format_cmp ( frame - > subclass . format , ast_format_slin ) = = AST_FORMAT_CMP_EQUAL ) {
if ( ! p - > subs [ idx ] . linear ) {
if ( ! p - > subs [ idx ] . linear ) {
@ -8823,10 +8836,12 @@ static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame)
}
}
res = my_dahdi_write ( p , ( unsigned char * ) frame - > data . ptr , frame - > datalen , idx , 0 ) ;
res = my_dahdi_write ( p , ( unsigned char * ) frame - > data . ptr , frame - > datalen , idx , 0 ) ;
} else {
} else {
ast_mutex_unlock ( & p - > lock ) ;
ast_log ( LOG_WARNING , " Cannot handle frames in %s format \n " ,
ast_log ( LOG_WARNING , " Cannot handle frames in %s format \n " ,
ast_format_get_name ( frame - > subclass . format ) ) ;
ast_format_get_name ( frame - > subclass . format ) ) ;
return - 1 ;
return - 1 ;
}
}
ast_mutex_unlock ( & p - > lock ) ;
if ( res < 0 ) {
if ( res < 0 ) {
ast_log ( LOG_WARNING , " write failed: %s \n " , strerror ( errno ) ) ;
ast_log ( LOG_WARNING , " write failed: %s \n " , strerror ( errno ) ) ;
return - 1 ;
return - 1 ;