@ -1168,7 +1168,9 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
struct ast_assigned_ids id1 = { NULL , NULL } ;
struct ast_assigned_ids id1 = { NULL , NULL } ;
struct ast_assigned_ids id2 = { NULL , NULL } ;
struct ast_assigned_ids id2 = { NULL , NULL } ;
int generated_seqno = ast_atomic_fetchadd_int ( ( int * ) & name_sequence , + 1 ) ;
int generated_seqno = ast_atomic_fetchadd_int ( ( int * ) & name_sequence , + 1 ) ;
struct ast_stream_topology * topology ;
int i ;
struct ast_stream_topology * chan_topology ;
struct ast_stream * stream ;
/* set unique ids for the two channels */
/* set unique ids for the two channels */
if ( assignedids & & ! ast_strlen_zero ( assignedids - > uniqueid ) ) {
if ( assignedids & & ! ast_strlen_zero ( assignedids - > uniqueid ) ) {
@ -1186,14 +1188,27 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
id2 . uniqueid = uniqueid2 ;
id2 . uniqueid = uniqueid2 ;
}
}
/* We need to create a topology to place on the first channel, as we can't
/* We need to create a topology to place on the second channel, as we can't
* share a single one between both .
* share a single one between both .
*/
*/
topology = ast_stream_topology_clone ( p - > reqtopology ) ;
chan_ topology = ast_stream_topology_clone ( p - > reqtopology ) ;
if ( ! topology) {
if ( ! chan_ topology) {
return NULL ;
return NULL ;
}
}
for ( i = 0 ; i < ast_stream_topology_get_count ( chan_topology ) ; + + i ) {
stream = ast_stream_topology_get_stream ( chan_topology , i ) ;
/* We need to make sure that the ;2 channel has the opposite stream topology
* of the first channel if the stream is one - way . I . e . if the first channel
* is recvonly , the second channel has to be sendonly and vice versa .
*/
if ( ast_stream_get_state ( stream ) = = AST_STREAM_STATE_RECVONLY ) {
ast_stream_set_state ( stream , AST_STREAM_STATE_SENDONLY ) ;
} else if ( ast_stream_get_state ( stream ) = = AST_STREAM_STATE_SENDONLY ) {
ast_stream_set_state ( stream , AST_STREAM_STATE_RECVONLY ) ;
}
}
/*
/*
* Allocate two new Asterisk channels
* Allocate two new Asterisk channels
*
*
@ -1206,7 +1221,7 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
" %s/%s-%08x;1 " , tech - > type , p - > name , ( unsigned ) generated_seqno ) ;
" %s/%s-%08x;1 " , tech - > type , p - > name , ( unsigned ) generated_seqno ) ;
if ( ! owner ) {
if ( ! owner ) {
ast_log ( LOG_WARNING , " Unable to allocate owner channel structure \n " ) ;
ast_log ( LOG_WARNING , " Unable to allocate owner channel structure \n " ) ;
ast_stream_topology_free ( topology) ;
ast_stream_topology_free ( chan_ topology) ;
return NULL ;
return NULL ;
}
}
@ -1221,7 +1236,8 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
ast_channel_nativeformats_set ( owner , p - > reqcap ) ;
ast_channel_nativeformats_set ( owner , p - > reqcap ) ;
if ( ast_channel_is_multistream ( owner ) ) {
if ( ast_channel_is_multistream ( owner ) ) {
ast_channel_set_stream_topology ( owner , topology ) ;
ast_channel_set_stream_topology ( owner , p - > reqtopology ) ;
p - > reqtopology = NULL ;
}
}
/* Determine our read/write format and set it on each channel */
/* Determine our read/write format and set it on each channel */
@ -1279,8 +1295,7 @@ struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
ast_channel_nativeformats_set ( chan , p - > reqcap ) ;
ast_channel_nativeformats_set ( chan , p - > reqcap ) ;
if ( ast_channel_is_multistream ( chan ) ) {
if ( ast_channel_is_multistream ( chan ) ) {
ast_channel_set_stream_topology ( chan , p - > reqtopology ) ;
ast_channel_set_stream_topology ( chan , chan_topology ) ;
p - > reqtopology = NULL ;
}
}
/* Format was already determined when setting up owner */
/* Format was already determined when setting up owner */