Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
331263a0
提交
331263a0
authored
9月 04, 2008
作者:
Brian West
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix tab
git-svn-id:
http://svn.freeswitch.org/svn/freeswitch/trunk@9446
d0543943-73ff-0310-b7d9-9358b9ac24b2
上级
3e3c7c9b
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
213 行增加
和
213 行删除
+213
-213
mod_fax.c
src/mod/applications/mod_fax/mod_fax.c
+213
-213
没有找到文件。
src/mod/applications/mod_fax/mod_fax.c
浏览文件 @
331263a0
...
@@ -49,8 +49,8 @@ static void span_message(int level, const char *msg)
...
@@ -49,8 +49,8 @@ static void span_message(int level, const char *msg)
/* TODO: maybe is better to use switch_assert here?
/* TODO: maybe is better to use switch_assert here?
if (msg==NULL) {
if (msg==NULL) {
return;
return;
}
}
*/
*/
switch_assert
(
msg
!=
NULL
);
switch_assert
(
msg
!=
NULL
);
...
@@ -77,8 +77,8 @@ static void span_message(int level, const char *msg)
...
@@ -77,8 +77,8 @@ static void span_message(int level, const char *msg)
break
;
break
;
default:
/* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */
default:
/* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */
fs_log_level
=
SWITCH_LOG_DEBUG
;
fs_log_level
=
SWITCH_LOG_DEBUG
;
}
}
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
fs_log_level
,
"%s"
,
msg
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
fs_log_level
,
"%s"
,
msg
);
}
}
/*
/*
...
@@ -100,7 +100,7 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result)
...
@@ -100,7 +100,7 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote sender ident: %s
\n
"
,
t30_get_rx_sender_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote sender ident: %s
\n
"
,
t30_get_rx_sender_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote password: %s
\n
"
,
t30_get_rx_password
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote password: %s
\n
"
,
t30_get_rx_password
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
return
T30_ERR_OK
;
return
T30_ERR_OK
;
};
};
...
@@ -110,31 +110,31 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result)
...
@@ -110,31 +110,31 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result)
static
int
phase_d_handler
(
t30_state_t
*
s
,
void
*
user_data
,
int
result
)
static
int
phase_d_handler
(
t30_state_t
*
s
,
void
*
user_data
,
int
result
)
{
{
t30_stats_t
t
;
t30_stats_t
t
;
int
session
;
int
session
;
switch_assert
(
user_data
!=
NULL
);
switch_assert
(
user_data
!=
NULL
);
session
=
(
intptr_t
)
user_data
;
session
=
(
intptr_t
)
user_data
;
if
(
result
)
{
if
(
result
)
{
t30_get_transfer_statistics
(
s
,
&
t
);
t30_get_transfer_statistics
(
s
,
&
t
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Phase D handler on channel %d - (0x%X) %s
\n
"
,
session
,
session
,
result
,
t30_frametype
(
result
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Phase D handler on channel %d - (0x%X) %s
\n
"
,
session
,
session
,
result
,
t30_frametype
(
result
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages transferred: %i
\n
"
,
t
.
pages_transferred
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages transferred: %i
\n
"
,
t
.
pages_transferred
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages in the file: %i
\n
"
,
t
.
pages_in_file
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages in the file: %i
\n
"
,
t
.
pages_in_file
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image size: %i x %i
\n
"
,
t
.
width
,
t
.
length
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image size: %i x %i
\n
"
,
t
.
width
,
t
.
length
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image resolution %i x %i
\n
"
,
t
.
x_resolution
,
t
.
y_resolution
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image resolution %i x %i
\n
"
,
t
.
x_resolution
,
t
.
y_resolution
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Transfer Rate: %i
\n
"
,
t
.
bit_rate
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Transfer Rate: %i
\n
"
,
t
.
bit_rate
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Bad rows %i
\n
"
,
t
.
bad_rows
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Bad rows %i
\n
"
,
t
.
bad_rows
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Longest bad row run %i
\n
"
,
t
.
longest_bad_row_run
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Longest bad row run %i
\n
"
,
t
.
longest_bad_row_run
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Compression type %i %s
\n
"
,
t
.
encoding
,
t4_encoding_to_str
(
t
.
encoding
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Compression type %i %s
\n
"
,
t
.
encoding
,
t4_encoding_to_str
(
t
.
encoding
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image size (bytes) %i
\n
"
,
t
.
image_size
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image size (bytes) %i
\n
"
,
t
.
image_size
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"ECM %s
\n
"
,
(
t
.
error_correcting_mode
)
?
"on"
:
"off"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"ECM %s
\n
"
,
(
t
.
error_correcting_mode
)
?
"on"
:
"off"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"local ident: %s
\n
"
,
t30_get_tx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"local ident: %s
\n
"
,
t30_get_tx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote ident: %s
\n
"
,
t30_get_rx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote ident: %s
\n
"
,
t30_get_rx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"bits per row - min %d, max %d
\n
"
,
s
->
t4
.
min_row_bits
,
s
->
t4
.
max_row_bits
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"bits per row - min %d, max %d
\n
"
,
s
->
t4
.
min_row_bits
,
s
->
t4
.
max_row_bits
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
}
}
return
T30_ERR_OK
;
return
T30_ERR_OK
;
}
}
...
@@ -144,32 +144,32 @@ static int phase_d_handler(t30_state_t *s, void *user_data, int result)
...
@@ -144,32 +144,32 @@ static int phase_d_handler(t30_state_t *s, void *user_data, int result)
static
void
phase_e_handler
(
t30_state_t
*
s
,
void
*
user_data
,
int
result
)
static
void
phase_e_handler
(
t30_state_t
*
s
,
void
*
user_data
,
int
result
)
{
{
t30_stats_t
t
;
t30_stats_t
t
;
const
char
*
far_ident
=
NULL
;
const
char
*
far_ident
=
NULL
;
switch_channel_t
*
chan
=
(
switch_channel_t
*
)
user_data
;
switch_channel_t
*
chan
=
(
switch_channel_t
*
)
user_data
;
char
buf
[
128
];
char
buf
[
128
];
switch_assert
(
user_data
!=
NULL
);
switch_assert
(
user_data
!=
NULL
);
if
(
result
==
T30_ERR_OK
)
{
if
(
result
==
T30_ERR_OK
)
{
t30_get_transfer_statistics
(
s
,
&
t
);
t30_get_transfer_statistics
(
s
,
&
t
);
far_ident
=
switch_str_nil
(
t30_get_tx_ident
(
s
)
);
far_ident
=
switch_str_nil
(
t30_get_tx_ident
(
s
)
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
//TODO: add received/transmitted ?
//TODO: add received/transmitted ?
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Fax successfully processed.
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Fax successfully processed.
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Remote station id: %s
\n
"
,
far_ident
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Remote station id: %s
\n
"
,
far_ident
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Local station id: %s
\n
"
,
switch_str_nil
(
t30_get_rx_ident
(
s
))
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Local station id: %s
\n
"
,
switch_str_nil
(
t30_get_rx_ident
(
s
))
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages transferred: %i
\n
"
,
t
.
pages_transferred
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Pages transferred: %i
\n
"
,
t
.
pages_transferred
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image resolution: %i x %i
\n
"
,
t
.
x_resolution
,
t
.
y_resolution
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Image resolution: %i x %i
\n
"
,
t
.
x_resolution
,
t
.
y_resolution
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Transfer Rate: %i
\n
"
,
t
.
bit_rate
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Transfer Rate: %i
\n
"
,
t
.
bit_rate
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"local ident: %s
\n
"
,
t30_get_tx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"local ident: %s
\n
"
,
t30_get_tx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote ident: %s
\n
"
,
t30_get_rx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"remote ident: %s
\n
"
,
t30_get_rx_ident
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station country: %s
\n
"
,
t30_get_rx_country
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station country: %s
\n
"
,
t30_get_rx_country
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station vendor: %s
\n
"
,
t30_get_rx_vendor
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station vendor: %s
\n
"
,
t30_get_rx_vendor
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station model: %s
\n
"
,
t30_get_rx_model
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"station model: %s
\n
"
,
t30_get_rx_model
(
s
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
//TODO: is the buffer too little? anyway <MikeJ> is going to write a new set_variable function that will allow a printf like syntax very soon
//TODO: is the buffer too little? anyway <MikeJ> is going to write a new set_variable function that will allow a printf like syntax very soon
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
t
.
pages_transferred
);
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
t
.
pages_transferred
);
...
@@ -179,19 +179,19 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
...
@@ -179,19 +179,19 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
t
.
bit_rate
);
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
t
.
bit_rate
);
switch_channel_set_variable
(
chan
,
"FAX_SPEED"
,
buf
);
switch_channel_set_variable
(
chan
,
"FAX_SPEED"
,
buf
);
}
else
{
}
else
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
//TODO: add received/transmitted ?
//TODO: add received/transmitted ?
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Fax processing not successful - result (%d) %s.
\n
"
,
result
,
t30_completion_code_to_str
(
result
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Fax processing not successful - result (%d) %s.
\n
"
,
result
,
t30_completion_code_to_str
(
result
));
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"==============================================================================
\n
"
);
}
}
//TODO: remove the assert once this has been tested
//TODO: remove the assert once this has been tested
switch_channel_set_variable
(
chan
,
"FAX_REMOTESTATIONID"
,
far_ident
);
switch_channel_set_variable
(
chan
,
"FAX_REMOTESTATIONID"
,
far_ident
);
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
result
);
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
result
);
switch_channel_set_variable
(
chan
,
"FAX_RESULT"
,
buf
);
switch_channel_set_variable
(
chan
,
"FAX_RESULT"
,
buf
);
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%s"
,
t30_completion_code_to_str
(
result
));
switch_snprintf
(
buf
,
sizeof
(
buf
),
"%s"
,
t30_completion_code_to_str
(
result
));
switch_channel_set_variable
(
chan
,
"FAX_ERROR"
,
buf
);
switch_channel_set_variable
(
chan
,
"FAX_ERROR"
,
buf
);
/*
/*
* TODO
* TODO
...
@@ -218,61 +218,61 @@ static int document_handler(t30_state_t *s, void *user_data, int event)
...
@@ -218,61 +218,61 @@ static int document_handler(t30_state_t *s, void *user_data, int event)
void
process_fax
(
switch_core_session_t
*
session
,
char
*
data
,
int
calling_party
)
void
process_fax
(
switch_core_session_t
*
session
,
char
*
data
,
int
calling_party
)
{
{
switch_channel_t
*
channel
;
switch_channel_t
*
channel
;
switch_codec_t
*
orig_read_codec
=
NULL
;
switch_codec_t
*
orig_read_codec
=
NULL
;
switch_codec_t
read_codec
=
{
0
};
switch_codec_t
read_codec
=
{
0
};
switch_codec_t
write_codec
=
{
0
};
switch_codec_t
write_codec
=
{
0
};
switch_frame_t
*
read_frame
=
{
0
};
switch_frame_t
*
read_frame
=
{
0
};
switch_frame_t
write_frame
=
{
0
};
switch_frame_t
write_frame
=
{
0
};
switch_status_t
status
;
switch_status_t
status
;
fax_state_t
fax
;
fax_state_t
fax
;
#define FAX_BUFFER_SIZE 4096
#define FAX_BUFFER_SIZE 4096
int16_t
buf
[
FAX_BUFFER_SIZE
];
//TODO original value: 512
int16_t
buf
[
FAX_BUFFER_SIZE
];
//TODO original value: 512
int
tx
=
0
;
int
tx
=
0
;
/*TODO: int calling_party = FALSE; DEPRECATED */
/*TODO: int calling_party = FALSE; DEPRECATED */
/* Channels variable parsing */
/* Channels variable parsing */
char
*
file_name
=
NULL
;
char
*
file_name
=
NULL
;
const
char
*
fax_local_debug
=
NULL
;
const
char
*
fax_local_debug
=
NULL
;
int
debug
=
FALSE
;
int
debug
=
FALSE
;
const
char
*
fax_local_number
=
NULL
;
const
char
*
fax_local_number
=
NULL
;
const
char
*
fax_local_name
=
NULL
;
const
char
*
fax_local_name
=
NULL
;
const
char
*
fax_local_subname
=
NULL
;
const
char
*
fax_local_subname
=
NULL
;
const
char
*
fax_local_ecm
=
NULL
;
const
char
*
fax_local_ecm
=
NULL
;
const
char
*
fax_local_v17
=
NULL
;
const
char
*
fax_local_v17
=
NULL
;
/* make sure we have a valid channel when starting the FAX application */
/* make sure we have a valid channel when starting the FAX application */
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
switch_assert
(
channel
!=
NULL
);
switch_assert
(
channel
!=
NULL
);
/* set output varialbles to a reasonable result */
/* set output varialbles to a reasonable result */
switch_channel_set_variable
(
channel
,
"FAX_REMOTESTATIONID"
,
"unknown"
);
switch_channel_set_variable
(
channel
,
"FAX_REMOTESTATIONID"
,
"unknown"
);
switch_channel_set_variable
(
channel
,
"FAX_PAGES"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_PAGES"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_SIZE"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_SIZE"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_SPEED"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_SPEED"
,
"0"
);
switch_channel_set_variable
(
channel
,
"FAX_RESULT"
,
"1"
);
switch_channel_set_variable
(
channel
,
"FAX_RESULT"
,
"1"
);
//TODO: add received/transmitted ?
//TODO: add received/transmitted ?
switch_channel_set_variable
(
channel
,
"FAX_ERROR"
,
"fax not processed yet"
);
switch_channel_set_variable
(
channel
,
"FAX_ERROR"
,
"fax not processed yet"
);
/*
/*
* SpanDSP initialization
* SpanDSP initialization
* if fax_init by any chance fails to start we return quickly without touching anything else
* if fax_init by any chance fails to start we return quickly without touching anything else
*/
*/
//TODO: ask Coppice to see if we need to clear the fax structure before fax_init is invoked
//TODO: ask Coppice to see if we need to clear the fax structure before fax_init is invoked
memset
(
&
fax
,
0
,
sizeof
(
fax
));
memset
(
&
fax
,
0
,
sizeof
(
fax
));
if
(
NULL
==
fax_init
(
&
fax
,
calling_party
))
{
if
(
NULL
==
fax_init
(
&
fax
,
calling_party
))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"fax_init failed
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"fax_init failed
\n
"
);
return
;
return
;
}
}
/*
/*
* Enable options based on channel variables and input parameters
* Enable options based on channel variables and input parameters
*/
*/
/* file_name - Sets the TIFF filename where do you want to save the fax */
/* file_name - Sets the TIFF filename where do you want to save the fax */
file_name
=
switch_core_session_strdup
(
session
,
data
);
file_name
=
switch_core_session_strdup
(
session
,
data
);
/* it is important that file_name is not NULL or an empty string */
/* it is important that file_name is not NULL or an empty string */
if
(
switch_strlen_zero
(
file_name
))
{
if
(
switch_strlen_zero
(
file_name
))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"fax filename is NULL or empty string
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"fax filename is NULL or empty string
\n
"
);
return
;
return
;
}
}
if
(
calling_party
)
if
(
calling_party
)
...
@@ -280,32 +280,32 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
...
@@ -280,32 +280,32 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
else
else
t30_set_rx_file
(
&
fax
.
t30
,
file_name
,
-
1
);
t30_set_rx_file
(
&
fax
.
t30
,
file_name
,
-
1
);
/* FAX_DEBUG - enable extra debugging if defined */
/* FAX_DEBUG - enable extra debugging if defined */
debug
=
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DEBUG"
)
);
debug
=
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DEBUG"
)
);
/* FAX_LOCAL_NUMBER - Set your station phone number */
/* FAX_LOCAL_NUMBER - Set your station phone number */
t30_set_tx_ident
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_NUMBER"
)));
t30_set_tx_ident
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_NUMBER"
)));
/* FAX_LOCAL_NAME - Set your station ID name (string) */
/* FAX_LOCAL_NAME - Set your station ID name (string) */
t30_set_tx_page_header_info
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_NAME"
)));
t30_set_tx_page_header_info
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_NAME"
)));
/* FAX_LOCAL_SUBNAME - Set your station ID sub name */
/* FAX_LOCAL_SUBNAME - Set your station ID sub name */
t30_set_tx_sub_address
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_SUBNAME"
)));
t30_set_tx_sub_address
(
&
fax
.
t30
,
switch_str_nil
(
switch_channel_get_variable
(
channel
,
"FAX_LOCAL_SUBNAME"
)));
/* FAX_DISABLE_ECM - Set if you want ECM on or OFF */
/* FAX_DISABLE_ECM - Set if you want ECM on or OFF */
if
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DISABLE_ECM"
))
{
if
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DISABLE_ECM"
))
{
t30_set_ecm_capability
(
&
fax
.
t30
,
TRUE
);
t30_set_ecm_capability
(
&
fax
.
t30
,
TRUE
);
t30_set_supported_compressions
(
&
fax
.
t30
,
T30_SUPPORT_T4_1D_COMPRESSION
|
T30_SUPPORT_T4_2D_COMPRESSION
|
T30_SUPPORT_T6_COMPRESSION
);
t30_set_supported_compressions
(
&
fax
.
t30
,
T30_SUPPORT_T4_1D_COMPRESSION
|
T30_SUPPORT_T4_2D_COMPRESSION
|
T30_SUPPORT_T6_COMPRESSION
);
}
else
{
}
else
{
t30_set_ecm_capability
(
&
fax
.
t30
,
FALSE
);
t30_set_ecm_capability
(
&
fax
.
t30
,
FALSE
);
}
}
/* FAX_DISABLE_V17 - set if you want 9600 or V17 (14.400) */
/* FAX_DISABLE_V17 - set if you want 9600 or V17 (14.400) */
if
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DISABLE_V17"
))
{
if
(
NULL
!=
switch_channel_get_variable
(
channel
,
"FAX_DISABLE_V17"
))
{
t30_set_supported_modems
(
&
fax
.
t30
,
T30_SUPPORT_V29
|
T30_SUPPORT_V27TER
|
T30_SUPPORT_V17
);
t30_set_supported_modems
(
&
fax
.
t30
,
T30_SUPPORT_V29
|
T30_SUPPORT_V27TER
|
T30_SUPPORT_V17
);
}
else
{
}
else
{
t30_set_supported_modems
(
&
fax
.
t30
,
T30_SUPPORT_V29
|
T30_SUPPORT_V27TER
);
t30_set_supported_modems
(
&
fax
.
t30
,
T30_SUPPORT_V29
|
T30_SUPPORT_V27TER
);
}
}
/* TODO, ask Coppice if this is really working or not and then add FAX_PASSWORD channel variable (don't forget the wiki part too)
/* TODO, ask Coppice if this is really working or not and then add FAX_PASSWORD channel variable (don't forget the wiki part too)
* t30_set_tx_password(&mc->fax.t30_state, "Password");
* t30_set_tx_password(&mc->fax.t30_state, "Password");
...
@@ -314,7 +314,7 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
...
@@ -314,7 +314,7 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
/* Configure more spanDSP internal options */
/* Configure more spanDSP internal options */
/* Select whether silent audio will be sent when FAX transmit is idle. */
/* Select whether silent audio will be sent when FAX transmit is idle. */
fax_set_transmit_on_idle
(
&
fax
,
TRUE
);
fax_set_transmit_on_idle
(
&
fax
,
TRUE
);
/* Support for different image sizes && resolutions */
/* Support for different image sizes && resolutions */
t30_set_supported_image_sizes
(
&
fax
.
t30
,
T30_SUPPORT_US_LETTER_LENGTH
|
T30_SUPPORT_US_LEGAL_LENGTH
|
T30_SUPPORT_UNLIMITED_LENGTH
t30_set_supported_image_sizes
(
&
fax
.
t30
,
T30_SUPPORT_US_LETTER_LENGTH
|
T30_SUPPORT_US_LEGAL_LENGTH
|
T30_SUPPORT_UNLIMITED_LENGTH
...
@@ -322,97 +322,97 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
...
@@ -322,97 +322,97 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
t30_set_supported_resolutions
(
&
fax
.
t30
,
T30_SUPPORT_STANDARD_RESOLUTION
|
T30_SUPPORT_FINE_RESOLUTION
|
T30_SUPPORT_SUPERFINE_RESOLUTION
t30_set_supported_resolutions
(
&
fax
.
t30
,
T30_SUPPORT_STANDARD_RESOLUTION
|
T30_SUPPORT_FINE_RESOLUTION
|
T30_SUPPORT_SUPERFINE_RESOLUTION
|
T30_SUPPORT_R8_RESOLUTION
|
T30_SUPPORT_R16_RESOLUTION
);
|
T30_SUPPORT_R8_RESOLUTION
|
T30_SUPPORT_R16_RESOLUTION
);
/* set phase handlers callbaks */
/* set phase handlers callbaks */
t30_set_phase_d_handler
(
&
fax
.
t30
,
phase_d_handler
,
session
);
t30_set_phase_d_handler
(
&
fax
.
t30
,
phase_d_handler
,
session
);
t30_set_phase_e_handler
(
&
fax
.
t30
,
phase_e_handler
,
channel
);
t30_set_phase_e_handler
(
&
fax
.
t30
,
phase_e_handler
,
channel
);
if
(
debug
)
{
if
(
debug
)
{
t30_set_phase_b_handler
(
&
fax
.
t30
,
phase_b_handler
,
session
);
t30_set_phase_b_handler
(
&
fax
.
t30
,
phase_b_handler
,
session
);
t30_set_document_handler
(
&
fax
.
t30
,
document_handler
,
session
);
t30_set_document_handler
(
&
fax
.
t30
,
document_handler
,
session
);
}
}
/* set spanDSP logging functions - set spanlog debug messages to be outputted somewhere */
/* set spanDSP logging functions - set spanlog debug messages to be outputted somewhere */
span_log_set_message_handler
(
&
fax
.
logging
,
span_message
);
span_log_set_message_handler
(
&
fax
.
logging
,
span_message
);
span_log_set_message_handler
(
&
fax
.
t30
.
logging
,
span_message
);
span_log_set_message_handler
(
&
fax
.
t30
.
logging
,
span_message
);
if
(
debug
)
{
if
(
debug
)
{
/* TODO: original
/* TODO: original
span_log_set_level(&fax.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_level(&fax.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_level(&fax.t30.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
span_log_set_level(&fax.t30.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
*/
*/
span_log_set_level
(
&
fax
.
logging
,
SPAN_LOG_NONE
|
SPAN_LOG_FLOW
|
SPAN_LOG_FLOW_2
|
SPAN_LOG_FLOW_3
|
SPAN_LOG_ERROR
|
SPAN_LOG_PROTOCOL_ERROR
|
SPAN_LOG_WARNING
|
SPAN_LOG_PROTOCOL_WARNING
|
SPAN_LOG_DEBUG
|
SPAN_LOG_DEBUG_2
|
SPAN_LOG_DEBUG_3
);
span_log_set_level
(
&
fax
.
logging
,
SPAN_LOG_NONE
|
SPAN_LOG_FLOW
|
SPAN_LOG_FLOW_2
|
SPAN_LOG_FLOW_3
|
SPAN_LOG_ERROR
|
SPAN_LOG_PROTOCOL_ERROR
|
SPAN_LOG_WARNING
|
SPAN_LOG_PROTOCOL_WARNING
|
SPAN_LOG_DEBUG
|
SPAN_LOG_DEBUG_2
|
SPAN_LOG_DEBUG_3
);
span_log_set_level
(
&
fax
.
t30
.
logging
,
SPAN_LOG_NONE
|
SPAN_LOG_FLOW
|
SPAN_LOG_FLOW_2
|
SPAN_LOG_FLOW_3
|
SPAN_LOG_ERROR
|
SPAN_LOG_PROTOCOL_ERROR
|
SPAN_LOG_WARNING
|
SPAN_LOG_PROTOCOL_WARNING
|
SPAN_LOG_DEBUG
|
SPAN_LOG_DEBUG_2
|
SPAN_LOG_DEBUG_3
);
span_log_set_level
(
&
fax
.
t30
.
logging
,
SPAN_LOG_NONE
|
SPAN_LOG_FLOW
|
SPAN_LOG_FLOW_2
|
SPAN_LOG_FLOW_3
|
SPAN_LOG_ERROR
|
SPAN_LOG_PROTOCOL_ERROR
|
SPAN_LOG_WARNING
|
SPAN_LOG_PROTOCOL_WARNING
|
SPAN_LOG_DEBUG
|
SPAN_LOG_DEBUG_2
|
SPAN_LOG_DEBUG_3
);
}
else
{
}
else
{
span_log_set_level
(
&
fax
.
logging
,
SPAN_LOG_SHOW_SEVERITY
|
SPAN_LOG_SHOW_PROTOCOL
);
span_log_set_level
(
&
fax
.
logging
,
SPAN_LOG_SHOW_SEVERITY
|
SPAN_LOG_SHOW_PROTOCOL
);
span_log_set_level
(
&
fax
.
t30
.
logging
,
SPAN_LOG_SHOW_SEVERITY
|
SPAN_LOG_SHOW_PROTOCOL
);
span_log_set_level
(
&
fax
.
t30
.
logging
,
SPAN_LOG_SHOW_SEVERITY
|
SPAN_LOG_SHOW_PROTOCOL
);
}
}
/* We're now ready to answer the channel and process the audio of the call */
/* We're now ready to answer the channel and process the audio of the call */
/* Answer the call, otherwise we're not getting incoming audio */
/* Answer the call, otherwise we're not getting incoming audio */
switch_channel_answer
(
channel
);
switch_channel_answer
(
channel
);
/* TODO:
/* TODO:
* it could be a good idea to disable ECHOCAN on ZAP channels and to reset volumes too
* it could be a good idea to disable ECHOCAN on ZAP channels and to reset volumes too
* anyone know how to do this if one of the channell is OpenZap isntead of Sofia?
* anyone know how to do this if one of the channell is OpenZap isntead of Sofia?
* TIPS: perhaps "disable_ec" apps ?
* TIPS: perhaps "disable_ec" apps ?
*/
*/
/* We store the original channel codec before switching both
/* We store the original channel codec before switching both
* legs of the calls to a linear 16 bit codec that is the one
* legs of the calls to a linear 16 bit codec that is the one
* used internally by spandsp and FS will do the transcoding
* used internally by spandsp and FS will do the transcoding
* from G.711 or any other original codec
* from G.711 or any other original codec
*/
*/
orig_read_codec
=
switch_core_session_get_read_codec
(
session
);
orig_read_codec
=
switch_core_session_get_read_codec
(
session
);
if
(
switch_core_codec_init
(
&
read_codec
,
if
(
switch_core_codec_init
(
&
read_codec
,
"L16"
,
"L16"
,
NULL
,
NULL
,
orig_read_codec
->
implementation
->
samples_per_second
,
orig_read_codec
->
implementation
->
samples_per_second
,
orig_read_codec
->
implementation
->
microseconds_per_frame
/
1000
,
orig_read_codec
->
implementation
->
microseconds_per_frame
/
1000
,
1
,
1
,
SWITCH_CODEC_FLAG_ENCODE
|
SWITCH_CODEC_FLAG_DECODE
,
SWITCH_CODEC_FLAG_ENCODE
|
SWITCH_CODEC_FLAG_DECODE
,
NULL
,
NULL
,
switch_core_session_get_pool
(
session
))
==
SWITCH_STATUS_SUCCESS
)
{
switch_core_session_get_pool
(
session
))
==
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Success L16 on Leg-A
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Success L16 on Leg-A
\n
"
);
}
else
{
}
else
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Failed L16 on Leg-A"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Failed L16 on Leg-A"
);
goto
done
;
goto
done
;
}
}
if
(
switch_core_codec_init
(
&
write_codec
,
if
(
switch_core_codec_init
(
&
write_codec
,
"L16"
,
"L16"
,
NULL
,
NULL
,
orig_read_codec
->
implementation
->
samples_per_second
,
orig_read_codec
->
implementation
->
samples_per_second
,
orig_read_codec
->
implementation
->
microseconds_per_frame
/
1000
,
orig_read_codec
->
implementation
->
microseconds_per_frame
/
1000
,
1
,
1
,
SWITCH_CODEC_FLAG_ENCODE
|
SWITCH_CODEC_FLAG_DECODE
,
SWITCH_CODEC_FLAG_ENCODE
|
SWITCH_CODEC_FLAG_DECODE
,
NULL
,
NULL
,
switch_core_session_get_pool
(
session
))
==
SWITCH_STATUS_SUCCESS
)
{
switch_core_session_get_pool
(
session
))
==
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Success L16 on Leg-B
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Success L16 on Leg-B
\n
"
);
}
else
{
}
else
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Failed L16 on Leg-B"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Raw Codec Activation Failed L16 on Leg-B"
);
goto
done
;
goto
done
;
}
}
write_frame
.
codec
=
&
write_codec
;
write_frame
.
codec
=
&
write_codec
;
write_frame
.
data
=
buf
;
write_frame
.
data
=
buf
;
/*
/*
* now we enter a loop where we read audio frames to the channels and will pass it to spandsp
* now we enter a loop where we read audio frames to the channels and will pass it to spandsp
* and if there is some outgoing frame we'll send it back to the calling fax machine
* and if there is some outgoing frame we'll send it back to the calling fax machine
*/
*/
while
(
switch_channel_ready
(
channel
))
{
while
(
switch_channel_ready
(
channel
))
{
/* read new audio frame from the channel */
/* read new audio frame from the channel */
status
=
switch_core_session_read_frame
(
session
,
&
read_frame
,
-
1
,
0
);
status
=
switch_core_session_read_frame
(
session
,
&
read_frame
,
-
1
,
0
);
if
(
!
SWITCH_READ_ACCEPTABLE
(
status
))
{
if
(
!
SWITCH_READ_ACCEPTABLE
(
status
))
{
goto
done
;
goto
done
;
}
}
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame Read: %d\n" , read_frame->samples);
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame Read: %d\n" , read_frame->samples);
/* pass the new incoming audio frame to the fax_rx application */
/* pass the new incoming audio frame to the fax_rx application */
if
(
fax_rx
(
&
fax
,
(
int16_t
*
)
read_frame
->
data
,
read_frame
->
samples
)
)
{
if
(
fax_rx
(
&
fax
,
(
int16_t
*
)
read_frame
->
data
,
read_frame
->
samples
)
)
{
//TODO
//TODO
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"FAX_RX error
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"FAX_RX error
\n
"
);
}
}
...
@@ -420,29 +420,29 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
...
@@ -420,29 +420,29 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
if
(
read_frame
->
samples
>
256
)
if
(
read_frame
->
samples
>
256
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"SAMPLES TOO BIG
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"SAMPLES TOO BIG
\n
"
);
if
((
tx
=
fax_tx
(
&
fax
,
(
int16_t
*
)
&
buf
,
write_codec
.
implementation
->
samples_per_frame
))
<
0
)
{
if
((
tx
=
fax_tx
(
&
fax
,
(
int16_t
*
)
&
buf
,
write_codec
.
implementation
->
samples_per_frame
))
<
0
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Fax_Tx Error
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Fax_Tx Error
\n
"
);
goto
done
;
goto
done
;
}
}
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax Tx : %d %d\n" , tx, write_codec.implementation->samples_per_frame);
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax Tx : %d %d\n" , tx, write_codec.implementation->samples_per_frame);
if
(
tx
!=
0
)
{
if
(
tx
!=
0
)
{
write_frame
.
datalen
=
tx
*
sizeof
(
int16_t
);
write_frame
.
datalen
=
tx
*
sizeof
(
int16_t
);
write_frame
.
samples
=
tx
;
write_frame
.
samples
=
tx
;
if
(
switch_core_session_write_frame
(
session
,
&
write_frame
,
-
1
,
0
)
!=
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_core_session_write_frame
(
session
,
&
write_frame
,
-
1
,
0
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Bad Write, datalen: %d, samples: %d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Bad Write, datalen: %d, samples: %d
\n
"
,
write_frame
.
datalen
,
write_frame
.
datalen
,
write_frame
.
samples
write_frame
.
samples
);
);
goto
done
;
goto
done
;
}
}
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame TX : %d %d\n" , write_frame.datalen, write_frame.samples);
//DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame TX : %d %d\n" , write_frame.datalen, write_frame.samples);
}
else
{
}
else
{
// TODO
// TODO
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"non trasmitting
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"non trasmitting
\n
"
);
}
}
}
}
done:
done:
...
@@ -450,22 +450,22 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
...
@@ -450,22 +450,22 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party)
if
(
debug
)
if
(
debug
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"FAX transmission has terminated.
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"FAX transmission has terminated.
\n
"
);
/* shutdown spandsp so it can create our tiff */
/* shutdown spandsp so it can create our tiff */
t30_terminate
(
&
fax
.
t30
);
t30_terminate
(
&
fax
.
t30
);
fax_release
(
&
fax
);
fax_release
(
&
fax
);
/* restore the original codecs over the channels */
/* restore the original codecs over the channels */
if
(
read_codec
.
implementation
)
{
if
(
read_codec
.
implementation
)
{
switch_core_codec_destroy
(
&
read_codec
);
switch_core_codec_destroy
(
&
read_codec
);
}
}
if
(
write_codec
.
implementation
)
{
if
(
write_codec
.
implementation
)
{
switch_core_codec_destroy
(
&
write_codec
);
switch_core_codec_destroy
(
&
write_codec
);
}
}
if
(
orig_read_codec
)
{
if
(
orig_read_codec
)
{
switch_core_session_set_read_codec
(
session
,
orig_read_codec
);
switch_core_session_set_read_codec
(
session
,
orig_read_codec
);
}
}
}
}
...
@@ -481,18 +481,18 @@ SWITCH_STANDARD_APP(rxfax_function)
...
@@ -481,18 +481,18 @@ SWITCH_STANDARD_APP(rxfax_function)
SWITCH_MODULE_LOAD_FUNCTION
(
mod_fax_load
)
SWITCH_MODULE_LOAD_FUNCTION
(
mod_fax_load
)
{
{
switch_application_interface_t
*
app_interface
;
switch_application_interface_t
*
app_interface
;
/* connect my internal structure to the blank pointer passed to me */
/* connect my internal structure to the blank pointer passed to me */
*
module_interface
=
switch_loadable_module_create_module_interface
(
pool
,
modname
);
*
module_interface
=
switch_loadable_module_create_module_interface
(
pool
,
modname
);
SWITCH_ADD_APP
(
app_interface
,
"rxfax"
,
"FAX Receive Application"
,
"FAX Receive Application"
,
rxfax_function
,
""
,
SAF_NONE
);
SWITCH_ADD_APP
(
app_interface
,
"rxfax"
,
"FAX Receive Application"
,
"FAX Receive Application"
,
rxfax_function
,
""
,
SAF_NONE
);
SWITCH_ADD_APP
(
app_interface
,
"txfax"
,
"FAX Transmit Application"
,
"FAX Transmit Application"
,
txfax_function
,
""
,
SAF_NONE
);
SWITCH_ADD_APP
(
app_interface
,
"txfax"
,
"FAX Transmit Application"
,
"FAX Transmit Application"
,
txfax_function
,
""
,
SAF_NONE
);
// TODO: ask if i can use LOG functions inside this macro
// TODO: ask if i can use LOG functions inside this macro
/* its important to debug the exact spandsp used */
/* its important to debug the exact spandsp used */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"using spandsp %i %i
\n
"
,
SPANDSP_RELEASE_DATE
,
SPANDSP_RELEASE_TIME
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"using spandsp %i %i
\n
"
,
SPANDSP_RELEASE_DATE
,
SPANDSP_RELEASE_TIME
);
/* indicate that the module should continue to be loaded */
/* indicate that the module should continue to be loaded */
return
SWITCH_STATUS_SUCCESS
;
return
SWITCH_STATUS_SUCCESS
;
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论