You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(68) |
Jul
(27) |
Aug
(1) |
Sep
(9) |
Oct
(16) |
Nov
(64) |
Dec
(18) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(11) |
Feb
(5) |
Mar
(20) |
Apr
(9) |
May
(8) |
Jun
(8) |
Jul
(2) |
Aug
|
Sep
(11) |
Oct
(34) |
Nov
(23) |
Dec
(34) |
2005 |
Jan
(41) |
Feb
(25) |
Mar
(25) |
Apr
(32) |
May
(27) |
Jun
(9) |
Jul
(36) |
Aug
(6) |
Sep
(3) |
Oct
(11) |
Nov
(2) |
Dec
(21) |
2006 |
Jan
(14) |
Feb
(8) |
Mar
(18) |
Apr
(6) |
May
|
Jun
(17) |
Jul
(14) |
Aug
(26) |
Sep
(34) |
Oct
(24) |
Nov
(48) |
Dec
(64) |
2007 |
Jan
(72) |
Feb
(21) |
Mar
(50) |
Apr
(41) |
May
(35) |
Jun
(50) |
Jul
(33) |
Aug
(32) |
Sep
(50) |
Oct
(85) |
Nov
(43) |
Dec
(33) |
2008 |
Jan
(10) |
Feb
(29) |
Mar
(15) |
Apr
(45) |
May
(5) |
Jun
(2) |
Jul
(14) |
Aug
(3) |
Sep
|
Oct
|
Nov
(3) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
(9) |
Feb
(3) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <do...@us...> - 2010-02-12 15:20:28
|
Revision: 1466 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1466&view=rev Author: dohpaz Date: 2010-02-12 15:20:18 +0000 (Fri, 12 Feb 2010) Log Message: ----------- Don't embed the manifest, esp. since for me the generated one is horked. Joy... Modified Paths: -------------- branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj Modified: branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj 2010-02-08 16:51:31 UTC (rev 1465) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj 2010-02-12 15:20:18 UTC (rev 1466) @@ -147,6 +147,7 @@ OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" IntermediateDirectory="$(OutDir)" ConfigurationType="2" + UseOfATL="1" CharacterSet="2" WholeProgramOptimization="1" > @@ -197,6 +198,7 @@ /> <Tool Name="VCManifestTool" + EmbedManifest="false" /> <Tool Name="VCXDCMakeTool" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <do...@us...> - 2010-02-08 16:51:44
|
Revision: 1465 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1465&view=rev Author: dohpaz Date: 2010-02-08 16:51:31 +0000 (Mon, 08 Feb 2010) Log Message: ----------- Add Visual Studio 2008 solution (and update for more recent dependencies). Added Paths: ----------- branches/team/elbunce/iaxclient/contrib/win/vs2008/ branches/team/elbunce/iaxclient/contrib/win/vs2008/iaxclient.sln branches/team/elbunce/iaxclient/contrib/win/vs2008/libgsm.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libiax2.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libogg.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libportaudio.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libportmixer.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libspeex.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libtheora.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/libvidcap.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/testcall.vcproj branches/team/elbunce/iaxclient/contrib/win/vs2008/vtestcall.vcproj Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/iaxclient.sln =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/iaxclient.sln (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/iaxclient.sln 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,221 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libportmixer", "libportmixer.vcproj", "{3A76129B-55AB-4D54-BAA7-08F63ED52569}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libportaudio", "libportaudio.vcproj", "{3B023516-2C69-4CCB-9302-239991B6EC2C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiaxclient", "libiaxclient.vcproj", "{9A9C003E-EAF6-4D0E-896F-E3994503C7E4}" + ProjectSection(ProjectDependencies) = postProject + {3B023516-2C69-4CCB-9302-239991B6EC2C} = {3B023516-2C69-4CCB-9302-239991B6EC2C} + {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} + {82C9BD79-9796-405F-8A28-3F538514AC3A} = {82C9BD79-9796-405F-8A28-3F538514AC3A} + {653F3841-3F26-49B9-AFCF-091DB4B67031} = {653F3841-3F26-49B9-AFCF-091DB4B67031} + {F5166D99-32BB-40D5-BE95-6F97F72C44CE} = {F5166D99-32BB-40D5-BE95-6F97F72C44CE} + {3A76129B-55AB-4D54-BAA7-08F63ED52569} = {3A76129B-55AB-4D54-BAA7-08F63ED52569} + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E} = {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiax2", "libiax2.vcproj", "{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsm", "libgsm.vcproj", "{82C9BD79-9796-405F-8A28-3F538514AC3A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libogg.vcproj", "{2F463562-375D-481E-A6E0-7C7D0DC1ED7A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libspeex.vcproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora", "libtheora.vcproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" + ProjectSection(ProjectDependencies) = postProject + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A} = {2F463562-375D-481E-A6E0-7C7D0DC1ED7A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testcall", "testcall.vcproj", "{6F5AEE93-BA87-465B-BC75-C41C434FC4E4}" + ProjectSection(ProjectDependencies) = postProject + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4} = {9A9C003E-EAF6-4D0E-896F-E3994503C7E4} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vtestcall", "vtestcall.vcproj", "{B5F8E725-85A8-4CB1-8824-B82127BB2B1E}" + ProjectSection(ProjectDependencies) = postProject + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4} = {9A9C003E-EAF6-4D0E-896F-E3994503C7E4} + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4} = {6F5AEE93-BA87-465B-BC75-C41C434FC4E4} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvidcap", "libvidcap.vcproj", "{F5166D99-32BB-40D5-BE95-6F97F72C44CE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_dll|Win32 = Debug_dll|Win32 + Debug_novideo_dll|Win32 = Debug_novideo_dll|Win32 + Debug_novideo|Win32 = Debug_novideo|Win32 + Debug|Win32 = Debug|Win32 + Release_dll|Win32 = Release_dll|Win32 + Release_novideo_dll|Win32 = Release_novideo_dll|Win32 + Release_novideo|Win32 = Release_novideo|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_dll|Win32.Build.0 = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_novideo_dll|Win32.Build.0 = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug_novideo|Win32.Build.0 = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Debug|Win32.Build.0 = Debug|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_dll|Win32.ActiveCfg = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_dll|Win32.Build.0 = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_novideo_dll|Win32.Build.0 = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release_novideo|Win32.Build.0 = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release|Win32.ActiveCfg = Release|Win32 + {3A76129B-55AB-4D54-BAA7-08F63ED52569}.Release|Win32.Build.0 = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_dll|Win32.Build.0 = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_novideo_dll|Win32.Build.0 = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug_novideo|Win32.Build.0 = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Debug|Win32.Build.0 = Debug|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_dll|Win32.ActiveCfg = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_dll|Win32.Build.0 = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_novideo_dll|Win32.Build.0 = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release_novideo|Win32.Build.0 = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release|Win32.ActiveCfg = Release|Win32 + {3B023516-2C69-4CCB-9302-239991B6EC2C}.Release|Win32.Build.0 = Release|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_dll|Win32.ActiveCfg = Debug_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_dll|Win32.Build.0 = Debug_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_novideo_dll|Win32.ActiveCfg = Debug_novideo_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_novideo_dll|Win32.Build.0 = Debug_novideo_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_novideo|Win32.ActiveCfg = Debug_novideo|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug_novideo|Win32.Build.0 = Debug_novideo|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Debug|Win32.Build.0 = Debug|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_dll|Win32.ActiveCfg = Release_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_dll|Win32.Build.0 = Release_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_novideo_dll|Win32.ActiveCfg = Release_novideo_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_novideo_dll|Win32.Build.0 = Release_novideo_dll|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_novideo|Win32.ActiveCfg = Release_novideo|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release_novideo|Win32.Build.0 = Release_novideo|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release|Win32.ActiveCfg = Release|Win32 + {9A9C003E-EAF6-4D0E-896F-E3994503C7E4}.Release|Win32.Build.0 = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_dll|Win32.Build.0 = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_novideo_dll|Win32.Build.0 = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug_novideo|Win32.Build.0 = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Win32.ActiveCfg = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Win32.Build.0 = Debug|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_dll|Win32.ActiveCfg = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_dll|Win32.Build.0 = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_novideo_dll|Win32.Build.0 = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release_novideo|Win32.Build.0 = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Win32.ActiveCfg = Release|Win32 + {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Win32.Build.0 = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_dll|Win32.Build.0 = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_novideo_dll|Win32.Build.0 = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug_novideo|Win32.Build.0 = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug|Win32.ActiveCfg = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Debug|Win32.Build.0 = Debug|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_dll|Win32.ActiveCfg = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_dll|Win32.Build.0 = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_novideo_dll|Win32.Build.0 = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release_novideo|Win32.Build.0 = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release|Win32.ActiveCfg = Release|Win32 + {82C9BD79-9796-405F-8A28-3F538514AC3A}.Release|Win32.Build.0 = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug_dll|Win32.Build.0 = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug|Win32.ActiveCfg = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Debug|Win32.Build.0 = Debug|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release_dll|Win32.ActiveCfg = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release_dll|Win32.Build.0 = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release|Win32.ActiveCfg = Release|Win32 + {2F463562-375D-481E-A6E0-7C7D0DC1ED7A}.Release|Win32.Build.0 = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_dll|Win32.Build.0 = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_novideo_dll|Win32.Build.0 = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_novideo|Win32.Build.0 = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_dll|Win32.ActiveCfg = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_dll|Win32.Build.0 = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_novideo_dll|Win32.Build.0 = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_novideo|Win32.Build.0 = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug_dll|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_dll|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_dll|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_dll|Win32.ActiveCfg = Debug_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_dll|Win32.Build.0 = Debug_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_novideo_dll|Win32.ActiveCfg = Debug_novideo_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_novideo_dll|Win32.Build.0 = Debug_novideo_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_novideo|Win32.ActiveCfg = Debug_novideo|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug_novideo|Win32.Build.0 = Debug_novideo|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Debug|Win32.Build.0 = Debug|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_dll|Win32.ActiveCfg = Release_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_dll|Win32.Build.0 = Release_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_novideo_dll|Win32.ActiveCfg = Release_novideo_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_novideo_dll|Win32.Build.0 = Release_novideo_dll|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_novideo|Win32.ActiveCfg = Release_novideo|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release_novideo|Win32.Build.0 = Release_novideo|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release|Win32.ActiveCfg = Release|Win32 + {6F5AEE93-BA87-465B-BC75-C41C434FC4E4}.Release|Win32.Build.0 = Release|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug_dll|Win32.ActiveCfg = Debug_dll|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug_dll|Win32.Build.0 = Debug_dll|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Debug|Win32.Build.0 = Debug|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release_dll|Win32.ActiveCfg = Release_dll|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release_dll|Win32.Build.0 = Release_dll|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release|Win32.ActiveCfg = Release|Win32 + {B5F8E725-85A8-4CB1-8824-B82127BB2B1E}.Release|Win32.Build.0 = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug_dll|Win32.ActiveCfg = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug_dll|Win32.Build.0 = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug_novideo_dll|Win32.ActiveCfg = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug_novideo|Win32.ActiveCfg = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Debug|Win32.Build.0 = Debug|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release_dll|Win32.ActiveCfg = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release_dll|Win32.Build.0 = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release_novideo_dll|Win32.ActiveCfg = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release_novideo|Win32.ActiveCfg = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release|Win32.ActiveCfg = Release|Win32 + {F5166D99-32BB-40D5-BE95-6F97F72C44CE}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/libgsm.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libgsm.vcproj (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libgsm.vcproj 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,260 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libgsm" + ProjectGUID="{82C9BD79-9796-405F-8A28-3F538514AC3A}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\lib\gsm\inc" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + DisableSpecificWarnings="4244" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + WholeProgramOptimization="true" + AdditionalIncludeDirectories="..\..\..\lib\gsm\inc" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + RuntimeLibrary="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + CompileAs="1" + DisableSpecificWarnings="4244" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\..\lib\gsm\src\add.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\code.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\debug.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\decode.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_create.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_decode.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_destroy.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_encode.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_explode.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_implode.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_option.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\gsm_print.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\long_term.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\lpc.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\preprocess.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\rpe.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\short_term.c" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\src\table.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\..\lib\gsm\inc\config.h" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\inc\gsm.h" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\inc\private.h" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\inc\proto.h" + > + </File> + <File + RelativePath="..\..\..\lib\gsm\inc\unproto.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/libiax2.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libiax2.vcproj (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libiax2.vcproj 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,236 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libiax2" + ProjectGUID="{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB;LIBIAX;_CRT_SECURE_NO_DEPRECATE;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + RuntimeLibrary="3" + BufferSecurityCheck="false" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + WholeProgramOptimization="true" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB;LIBIAX;_CRT_SECURE_NO_DEPRECATE;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + RuntimeLibrary="2" + BufferSecurityCheck="false" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\..\lib\libiax2\src\iax.c" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\iax2-parser.c" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\jitterbuf.c" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\md5.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\..\lib\libiax2\src\answer.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\busy.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\dialtone.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\frame.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\iax-client.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\iax.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\iax2-parser.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\iax2.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\jitterbuf.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\md5.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\miniphone.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\options.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\ring10.h" + > + </File> + <File + RelativePath="..\..\..\lib\libiax2\src\ringtone.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libiaxclient.vcproj 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,891 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libiaxclient" + ProjectGUID="{9A9C003E-EAF6-4D0E-896F-E3994503C7E4}" + RootNamespace="libiaxclient" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\..\libogg\include;..\..\..\..\libtheora\include;..\..\..\lib\portmixer\px_common;..\..\..\..\libvidcap\include" + PreprocessorDefinitions="WIN32;_DEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;USE_VIDEO;USE_THEORA;CODEC_GSM" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + AdditionalDependencies="libiax2.lib libvidcap.lib libportmixer.lib libportaudio.lib libgsm.lib libogg.lib libspeex.lib libtheora.lib comsuppw.lib strmiids.lib wininet.lib" + AdditionalLibraryDirectories=""$(SolutionDir)$(ConfigurationName)\libiax2";"$(SolutionDir)$(ConfigurationName)\libvidcap";"$(SolutionDir)$(ConfigurationName)\libportaudio";"$(SolutionDir)$(ConfigurationName)\libportmixer";"$(SolutionDir)$(ConfigurationName)\libogg";"$(SolutionDir)$(ConfigurationName)\libtheora";"$(SolutionDir)$(ConfigurationName)\libspeex";"$(SolutionDir)$(ConfigurationName)\libgsm"" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\..\libogg\include;..\..\..\..\libtheora\include;..\..\..\lib\portmixer\px_common;..\..\..\..\libvidcap\include" + PreprocessorDefinitions="WIN32;NDEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;USE_VIDEO;USE_THEORA;CODEC_GSM" + RuntimeLibrary="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + AdditionalDependencies="libiax2.lib libvidcap.lib libportmixer.lib libportaudio.lib libgsm.lib libogg.lib libspeex.lib libtheora.lib comsuppw.lib strmiids.lib wininet.lib" + AdditionalLibraryDirectories=""$(SolutionDir)$(ConfigurationName)\libiax2";"$(SolutionDir)$(ConfigurationName)\libvidcap";"$(SolutionDir)$(ConfigurationName)\libportaudio";"$(SolutionDir)$(ConfigurationName)\libportmixer";"$(SolutionDir)$(ConfigurationName)\libogg";"$(SolutionDir)$(ConfigurationName)\libtheora";"$(SolutionDir)$(ConfigurationName)\libspeex";"$(SolutionDir)$(ConfigurationName)\libgsm"" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_dll|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="2" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\..\libogg\include;..\..\..\..\libtheora\include;..\..\..\lib\portmixer\px_common;..\..\..\..\libvidcap\include" + PreprocessorDefinitions="WIN32;NDEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;USE_VIDEO;USE_THEORA;CODEC_GSM" + RuntimeLibrary="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkLibraryDependencies="false" + AdditionalDependencies="libiax2.lib libvidcap.lib libportmixer.lib libportaudio.lib libgsm.lib libogg.lib libspeex.lib libtheora.lib comsuppw.lib strmiids.lib wininet.lib ws2_32.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Release\libiax2";"$(SolutionDir)Release\libvidcap";"$(SolutionDir)Release\libportaudio";"$(SolutionDir)Release\libportmixer";"$(SolutionDir)Release\libogg";"$(SolutionDir)Release\libtheora";"$(SolutionDir)Release\libspeex";"$(SolutionDir)Release\libgsm"" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_dll|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="2" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\..\libogg\include;..\..\..\..\libtheora\include;..\..\..\lib\portmixer\px_common;..\..\..\..\libvidcap\include" + PreprocessorDefinitions="WIN32;_DEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;USE_VIDEO;USE_THEORA;CODEC_GSM" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkLibraryDependencies="false" + AdditionalDependencies="libiax2.lib libvidcap.lib libportmixer.lib libportaudio.lib libgsm.lib libogg.lib libspeex.lib libtheora.lib comsuppw.lib strmiids.lib wininet.lib ws2_32.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Debug\libiax2";"$(SolutionDir)Debug\libvidcap";"$(SolutionDir)Debug\libportaudio";"$(SolutionDir)Debug\libportmixer";"$(SolutionDir)Debug\libogg";"$(SolutionDir)Debug\libtheora";"$(SolutionDir)Debug\libspeex";"$(SolutionDir)Debug\libgsm"" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_novideo|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\lib\portmixer\px_common" + PreprocessorDefinitions="WIN32;NDEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;CODEC_GSM" + RuntimeLibrary="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + AdditionalDependencies="libiax2.lib libportmixer.lib libportaudio.lib libgsm.lib libspeex.lib comsuppw.lib strmiids.lib wininet.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Release\libiax2";"$(SolutionDir)Release\libportaudio";"$(SolutionDir)Release\libportmixer";"$(SolutionDir)Release\libspeex";"$(SolutionDir)Release\libgsm"" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_novideo|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\lib\portmixer\px_common" + PreprocessorDefinitions="WIN32;_DEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;CODEC_GSM" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + AdditionalDependencies="libiax2.lib libportmixer.lib libportaudio.lib libgsm.lib libspeex.lib comsuppw.lib strmiids.lib wininet.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Debug\libiax2";"$(SolutionDir)Debug\libportaudio";"$(SolutionDir)Debug\libportmixer";"$(SolutionDir)Debug\libspeex";"$(SolutionDir)Debug\libgsm"" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release_novideo_dll|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="2" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\lib\portmixer\px_common" + PreprocessorDefinitions="WIN32;NDEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;CODEC_GSM" + RuntimeLibrary="2" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkLibraryDependencies="false" + AdditionalDependencies="libiax2.lib libportmixer.lib libportaudio.lib libgsm.lib libspeex.lib comsuppw.lib strmiids.lib wininet.lib ws2_32.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Release\libiax2";"$(SolutionDir)Release\libportaudio";"$(SolutionDir)Release\libportmixer";"$(SolutionDir)Release\libspeex";"$(SolutionDir)Release\libgsm"" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug_novideo_dll|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="2" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\lib\libiax2\src;..\..\..\..\portaudio\include;..\..\..\lib\spandsp;..\..\..\lib\gsm\inc;..\..\..\..\speex\include;..\..\..\lib\portmixer\px_common" + PreprocessorDefinitions="WIN32;_DEBUG;BUILDING_DLL;_CRT_SECURE_NO_DEPRECATE;strncasecmp=strnicmp;__inline__=_inline;NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500;CODEC_GSM" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkLibraryDependencies="false" + AdditionalDependencies="libiax2.lib libportmixer.lib libportaudio.lib libgsm.lib libspeex.lib comsuppw.lib strmiids.lib wininet.lib ws2_32.lib" + AdditionalLibraryDirectories=""$(SolutionDir)Debug\libiax2";"$(SolutionDir)Debug\libportaudio";"$(SolutionDir)Debug\libportmixer";"$(SolutionDir)Debug\libspeex";"$(SolutionDir)Debug\libgsm"" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\..\lib\audio_encode.c" + > + </File> + <File + RelativePath="..\..\..\lib\audio_portaudio.c" + > + </File> + <File + RelativePath="..\..\..\lib\codec_alaw.c" + > + </File> + <File + RelativePath="..\..\..\lib\codec_gsm.c" + > + </File> + <File + RelativePath="..\..\..\lib\codec_speex.c" + > + </File> + <File + RelativePath="..\..\..\lib\codec_theora.c" + > + <FileConfiguration + Name="Release_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\lib\codec_ulaw.c" + > + </File> + <File + RelativePath="..\..\..\lib\iaxclient_lib.c" + > + </File> + <File + RelativePath="..\..\..\lib\spandsp\plc.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_dll|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_dll|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo_dll|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo_dll|Win32" + > + <Tool + Name="VCCLCompilerTool" + CompileAs="2" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\lib\ringbuffer.c" + > + </File> + <File + RelativePath="..\..\..\lib\slice.c" + > + </File> + <File + RelativePath="..\..\..\lib\video.c" + > + <FileConfiguration + Name="Release_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\lib\winfuncs.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\..\lib\audio_alsa.h" + > + </File> + <File + RelativePath="..\..\..\lib\audio_encode.h" + > + </File> + <File + RelativePath="..\..\..\lib\audio_portaudio.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_alaw.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_ffmpeg.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_gsm.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_ilbc.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_speex.h" + > + </File> + <File + RelativePath="..\..\..\lib\codec_theora.h" + > + <FileConfiguration + Name="Release_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\lib\codec_ulaw.h" + > + </File> + <File + RelativePath="..\..\..\lib\iaxclient.h" + > + </File> + <File + RelativePath="..\..\..\lib\iaxclient_lib.h" + > + </File> + <File + RelativePath="..\..\..\lib\ringbuffer.h" + > + </File> + <File + RelativePath="..\..\..\lib\slice.h" + > + </File> + <File + RelativePath="..\..\..\lib\video.h" + > + <FileConfiguration + Name="Release_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug_novideo_dll|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/libogg.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libogg.vcproj (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libogg.vcproj 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libogg" + ProjectGUID="{2F463562-375D-481E-A6E0-7C7D0DC1ED7A}" + RootNamespace="libogg" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\..\libogg\include" + PreprocessorDefinitions="NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="4" + Detect64BitPortabilityProblems="true" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="..\..\..\..\libogg\include" + PreprocessorDefinitions="NTDDI_VERSION=NTDDI_WIN2KSP4;_WIN32_WINNT=0x0500;WINVER=0x0500" + StringPooling="true" + RuntimeLibrary="2" + WarningLevel="4" + Detect64BitPortabilityProblems="true" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\..\..\libogg\src\bitwise.c" + > + </File> + <File + RelativePath="..\..\..\..\libogg\src\framing.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\..\..\libogg\include\ogg\ogg.h" + > + </File> + <File + RelativePath="..\..\..\..\libogg\include\ogg\os_types.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: branches/team/elbunce/iaxclient/contrib/win/vs2008/libportaudio.vcproj =================================================================== --- branches/team/elbunce/iaxclient/contrib/win/vs2008/libportaudio.vcproj (rev 0) +++ branches/team/elbunce/iaxclient/contrib/win/vs2008/libportaudio.vcproj 2010-02-08 16:51:31 UTC (rev 1465) @@ -0,0 +1,288 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libportaudio" + ProjectGUID="{3B023516-2C69-4CCB-9302-239991B6EC2C}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)\$(ConfigurationName)\$(ProjectName)" + IntermediateDirectory="$(OutDir)" + ConfigurationType="4" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\..\portaudio\include;..\..\..\..\portaudio\src\common" + PreprocessorDefinitions="WIN32;_DEBUG;_LIB;PA_NO_DS;PA_NO_ASIO;NTDDI_VERSION=NTDDI_WIN2KSP4;_... [truncated message content] |
From: <do...@us...> - 2010-02-02 14:48:50
|
Revision: 1464 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1464&view=rev Author: dohpaz Date: 2010-02-02 14:48:34 +0000 (Tue, 02 Feb 2010) Log Message: ----------- Merge trunk r1449:1463 out to elbunce branch. Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/audio_portaudio.c branches/team/elbunce/iaxclient/lib/codec_ffmpeg.c branches/team/elbunce/iaxclient/lib/codec_theora.c branches/team/elbunce/iaxclient/lib/iaxclient.h branches/team/elbunce/iaxclient/lib/iaxclient_lib.h branches/team/elbunce/iaxclient/lib/slice.c branches/team/elbunce/iaxclient/lib/slice.h branches/team/elbunce/iaxclient/lib/video.c branches/team/elbunce/iaxclient/simpleclient/stresstest/file.c branches/team/elbunce/iaxclient/simpleclient/stresstest/stresstest.c Property Changed: ---------------- branches/team/elbunce/iaxclient/ Property changes on: branches/team/elbunce/iaxclient ___________________________________________________________________ Added: svn:mergeinfo + /trunk:1450-1463 Modified: branches/team/elbunce/iaxclient/lib/audio_portaudio.c =================================================================== --- branches/team/elbunce/iaxclient/lib/audio_portaudio.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/audio_portaudio.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -551,51 +551,67 @@ return 0; } +// NOTE: pa_open does not require an input device for success static int pa_open(int single, int inMono, int outMono) { PaError err; - PaDeviceInfo *result; + PaDeviceInfo *in_dev_info, *out_dev_info; - struct PaStreamParameters in_stream_params, out_stream_params, no_device; + struct PaStreamParameters in_stream_params, out_stream_params, *in_params; + + if ( selectedInput != paNoDevice ) + { + in_dev_info = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); + if ( in_dev_info == NULL ) + return -1; + in_stream_params.device = selectedInput; in_stream_params.channelCount = (inMono ? 1 : 2); in_stream_params.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); - if ( result == NULL ) return -1; - in_stream_params.suggestedLatency = result->defaultLowInputLatency; + in_stream_params.suggestedLatency = in_dev_info->defaultLowInputLatency; in_stream_params.hostApiSpecificStreamInfo = NULL; + in_params = &in_stream_params; + } + else + in_params = NULL; + + out_dev_info = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedOutput); + if ( out_dev_info == NULL ) + return -1; + out_stream_params.device = selectedOutput; out_stream_params.channelCount = (outMono ? 1 : 2); out_stream_params.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedOutput); - if ( result == NULL ) return -1; - out_stream_params.suggestedLatency = result->defaultLowOutputLatency; + out_stream_params.suggestedLatency = out_dev_info->defaultLowOutputLatency; out_stream_params.hostApiSpecificStreamInfo = NULL; - no_device.device = paNoDevice; - no_device.channelCount = 0; - no_device.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); - if ( result == NULL ) return -1; - no_device.suggestedLatency = result->defaultLowInputLatency; // FEEDBACK - unsure if appropriate - no_device.hostApiSpecificStreamInfo = NULL; - - if ( single ) + // if there is no input device, there's no point in dual streams + if ( single || selectedInput == paNoDevice ) { - err = Pa_OpenStream(&iStream, - &in_stream_params, + err = Pa_OpenStream(&oStream, + in_params, &out_stream_params, iaxci_sample_rate, SAMPLES_PER_FRAME, paNoFlag, (PaStreamCallback *)pa_callback, NULL); - if (err != paNoError) return -1; - oStream = iStream; + if (err != paNoError) + return -1; + + iStream = oStream; oneStream = 1; } else { + struct PaStreamParameters no_device; + + no_device.device = paNoDevice; + no_device.channelCount = 0; + no_device.sampleFormat = paInt16; + no_device.suggestedLatency = in_dev_info->defaultLowInputLatency; // FEEDBACK - unsure if appropriate + no_device.hostApiSpecificStreamInfo = NULL; + err = Pa_OpenStream(&iStream, &in_stream_params, &no_device, @@ -604,7 +620,8 @@ paNoFlag, (PaStreamCallback *)pa_callback, NULL); - if ( err != paNoError ) return -1; + if ( err != paNoError ) + return -1; err = Pa_OpenStream(&oStream, &no_device, @@ -762,19 +779,28 @@ if ( pa_openstreams(d) ) return -1; - if ( Pa_StartStream(iStream) != paNoError ) + if ( selectedInput == paNoDevice ) + { + if ( Pa_StartStream(oStream) != paNoError ) return -1; + oMixer = Px_OpenMixer(oStream, 0); + } + else + { + if ( Pa_StartStream(iStream) != paNoError ) + return -1; + iMixer = Px_OpenMixer(iStream, 0); if ( !oneStream ) { - PaError err = Pa_StartStream(oStream); - oMixer = Px_OpenMixer(oStream, 0); - if ( err != paNoError ) + if ( Pa_StartStream(oStream) != paNoError ) { Pa_StopStream(iStream); return -1; + } + oMixer = Px_OpenMixer(oStream, 0); } } @@ -842,13 +868,13 @@ if ( sounds ) return 0; - err = Pa_AbortStream(iStream); - err = Pa_CloseStream(iStream); + err = Pa_AbortStream(oStream); + err = Pa_CloseStream(oStream); if ( !oneStream ) { - err = Pa_AbortStream(oStream); - err = Pa_CloseStream(oStream); + err = Pa_AbortStream(iStream); + err = Pa_CloseStream(iStream); } if ( auxStream ) @@ -865,8 +891,8 @@ * I bet if it's gone, no one will miss it. Such a cold, cold world! static void pa_shutdown() { - CloseAudioStream( iStream ); - if(!oneStream) CloseAudioStream( oStream ); + CloseAudioStream( oStream ); + if(!oneStream) CloseAudioStream( iStream ); if(auxStream) CloseAudioStream( aStream ); } */ Modified: branches/team/elbunce/iaxclient/lib/codec_ffmpeg.c =================================================================== --- branches/team/elbunce/iaxclient/lib/codec_ffmpeg.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/codec_ffmpeg.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -209,7 +209,7 @@ } static int decode_iaxc_slice(struct iaxc_video_codec * c, int inlen, - char * in, int * outlen, char * out) + char * in, int * outlen, char * out, int * frames_dropped) { struct decoder_ctx *d = (struct decoder_ctx *) c->decstate; struct slice_header_t * sh_saved = &d->slice_header; @@ -217,10 +217,15 @@ char * inp; int ret; + *frames_dropped = 0; + inp = parse_slice_header(in, &sh_this); if ( !inp ) + { + *frames_dropped = 1; return -1; + } inlen -= inp - in; @@ -237,6 +242,8 @@ } else if ( frame_delta > 0 ) { + *frames_dropped = frame_delta - 1; + /* This slice belongs to a future frame */ if ( sh_saved->slice_index > 0 ) { @@ -254,7 +261,10 @@ reset_decoder_frame_state(d); if ( ret ) + { + *frames_dropped += 1; return -1; + } } sh_saved->frame_index = sh_this.frame_index; @@ -272,6 +282,7 @@ { fprintf(stderr, "codec_ffmpeg: decode: slice overflows decoder frame buffer\n"); + *frames_dropped = 1; return -1; } @@ -294,7 +305,10 @@ reset_decoder_frame_state(d); if ( ret ) + { + *frames_dropped = 1; return -1; + } return 0; } Modified: branches/team/elbunce/iaxclient/lib/codec_theora.c =================================================================== --- branches/team/elbunce/iaxclient/lib/codec_theora.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/codec_theora.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -66,6 +66,7 @@ theora_comment tc; struct deslicer_context *dsc; int got_key_frame; + unsigned short prev_src_id; }; struct theora_encoder @@ -112,7 +113,7 @@ } static int decode(struct iaxc_video_codec *c, int inlen, const char *in, - int *outlen, char *out) + int *outlen, char *out, int * frames_dropped) { struct theora_decoder *d; ogg_packet op; @@ -123,6 +124,8 @@ int flen; char *frame; + *frames_dropped = 0; + // Sanity checks if ( !c || !c->decstate || !in || inlen <= 0 || !out || !outlen ) return -1; @@ -132,7 +135,7 @@ if ( !d->dsc ) return -1; - frame = deslice(in, inlen, &flen, d->dsc); + frame = deslice(in, inlen, &flen, d->dsc, frames_dropped); if ( frame == NULL ) return 1; @@ -141,8 +144,12 @@ op.bytes = flen; op.packet = (unsigned char *)frame; - /* reject all incoming frames until we get a key frame */ - if ( !d->got_key_frame ) + /* Reject all incoming frames until we get a key frame. + * Similarly, check for a change in who is sending the video. + * We shouldn't use frames from a new source until + * we get a keyframe + */ + if ( !d->got_key_frame || d->prev_src_id != d->dsc->source_id ) { if ( theora_packet_iskeyframe(&op) ) d->got_key_frame = 1; @@ -177,6 +184,10 @@ return -1; } + // keep track of the source id (from the most + // recent valid desliced frame) to detect a switch + d->prev_src_id = d->dsc->source_id; + //clear output memset(out, 127, my_out_len); @@ -304,7 +315,11 @@ slice_set->key_frame = theora_packet_iskeyframe(&op) == 1; // Slice the frame - slice((char *)op.packet, op.bytes, slice_set, e->sc); + if ( slice((char *)op.packet, op.bytes, slice_set, e->sc) ) + { + fprintf(stderr, "codec_theora: failed to slice an encoded packet\n"); + return -1; + } return 0; } Modified: branches/team/elbunce/iaxclient/lib/iaxclient.h =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient.h 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/iaxclient.h 2010-02-02 14:48:34 UTC (rev 1464) @@ -270,7 +270,7 @@ int format; /*! - The audio format of the call. + The video format of the call. \see IAXC_FORMAT_JPEG, IAXC_FORMAT_PNG, IAXC_FORMAT_H261, IAXC_FORMAT_H263, IAXC_FORMAT_H263_PLUS, IAXC_FORMAT_H264, IAXC_FORMAT_MPEG4, Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.h =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.h 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.h 2010-02-02 14:48:34 UTC (rev 1464) @@ -171,8 +171,10 @@ void (*destroy) ( struct iaxc_audio_codec *codec); }; +//FIXME: This is all very static. What of higher +// bitrates, that require more slices? #define MAX_TRUNK_LEN (1<<16) -#define MAX_NO_SLICES 32 +#define MAX_NO_SLICES 64 struct slice_set_t { @@ -197,7 +199,8 @@ int (*encode)(struct iaxc_video_codec * codec, int inlen, const char * in, struct slice_set_t * out); int (*decode)(struct iaxc_video_codec * codec, int inlen, - const char * in, int * outlen, char * out); + const char * in, int * outlen, char * out, + int * frames_dropped); void (*destroy)(struct iaxc_video_codec * codec); }; Modified: branches/team/elbunce/iaxclient/lib/slice.c =================================================================== --- branches/team/elbunce/iaxclient/lib/slice.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/slice.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -41,10 +41,30 @@ int i, ssize; if ( data == NULL || slice_set == NULL || sc == NULL) + { + fprintf(stderr, "slice: invalid param(s): data=%p, set=%p, context=%p\n", + data, slice_set, sc); return -1; + } + // Theora packets can be 0-byte (delta-frame with no coded blocks) + if ( size ) + { // Figure out how many slices we need slice_set->num_slices = (size - 1) / sc->slice_size + 1; + + if ( slice_set->num_slices > MAX_NO_SLICES ) + { + fprintf(stderr, "slice: %d-byte frame is too large " + "- would require %d slices\n", + size, slice_set->num_slices); + return -1; + } + } + else + { + slice_set->num_slices = 1; + } for ( i = 0; i < slice_set->num_slices; i++ ) { @@ -94,11 +114,13 @@ } char * -deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc) +deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc, int *frames_dropped) { unsigned char frame_index, slice_index, num_slices, version; unsigned short source_id; + *frames_dropped = 0; + // Sanity checks if ( dsc == NULL || in == NULL || inlen <= 0 || outlen == NULL ) return NULL; @@ -139,10 +161,14 @@ /* Slice belongs to a new frame */ dsc->frame_index = frame_index; + *frames_dropped += frame_delta - 1; + if ( dsc->slice_count > 0 ) { /* Current frame is incomplete, drop it */ reset_deslicer_context(dsc); + + *frames_dropped += 1; } } } else @@ -159,6 +185,9 @@ if ( dsc->slice_size * slice_index + inlen > MAX_ENCODED_FRAME_SIZE ) { // Frame would be too large, ignore slice + fprintf(stderr, "deslice: dropping frame that's > %d bytes\n", + MAX_ENCODED_FRAME_SIZE); + *frames_dropped = 1; return NULL; } Modified: branches/team/elbunce/iaxclient/lib/slice.h =================================================================== --- branches/team/elbunce/iaxclient/lib/slice.h 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/slice.h 2010-02-02 14:48:34 UTC (rev 1464) @@ -39,7 +39,12 @@ #include "iaxclient_lib.h" -#define MAX_ENCODED_FRAME_SIZE 48 * 1024 +// We don't bother deslicing frames larger than this, +// but we DO slice-up frames as long as they don't exceed +// MAX_NO_SLICES, each up to MAX_TRUNK_LEN long +// ( see definition of struct slice_set_t ) +//FIXME: this doesn't depend on the bitrate +#define MAX_ENCODED_FRAME_SIZE 96 * 1024 struct slicer_context { @@ -104,6 +109,7 @@ * outlen with the frame size if successful */ char * -deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc); +deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc, + int * frames_dropped); #endif Modified: branches/team/elbunce/iaxclient/lib/video.c =================================================================== --- branches/team/elbunce/iaxclient/lib/video.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/lib/video.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -1255,6 +1255,7 @@ int ret; struct timeval now; long time; + int frames_dropped; if ( !call ) return 0; @@ -1311,8 +1312,10 @@ call->vdecoder->video_stats.acc_recv_size * 8000 / time; ret = call->vdecoder->decode(call->vdecoder, encoded_video_len, - (char *)encoded_video, &out_size, yuv_buf); + (char *)encoded_video, &out_size, yuv_buf, &frames_dropped); + call->vdecoder->video_stats.dropped_frames += (unsigned long) frames_dropped; + if ( ret < 0 ) { fprintf(stderr, "ERROR: decode error\n"); @@ -1823,7 +1826,14 @@ vinfo.sc = create_slicer_context((unsigned short)rand(), vfinfo.fragsize); - slice(data, size, &slice_set, vinfo.sc); + if ( slice(data, size, &slice_set, vinfo.sc) ) + { + fprintf(stderr, "iaxc_push_video: Failed to slice frame," + " call %d, size %d\n", + selected_call, size); + return -1; + } + for ( i = 0 ; i < slice_set.num_slices ; i++ ) { if ( iax_send_video_trunk(call->session, Modified: branches/team/elbunce/iaxclient/simpleclient/stresstest/file.c =================================================================== --- branches/team/elbunce/iaxclient/simpleclient/stresstest/file.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/simpleclient/stresstest/file.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -199,8 +199,8 @@ read_speex_cb(oggz, op, serialno, data); } else { - mylog("Got unknown ogg packet, serialno=%d, size=%d, " - "packetno=%d, granulepos=%d\n", + mylog("Got unknown ogg packet, serialno=%ld, size=%ld, " + "packetno=%lld, granulepos=%lld\n", serialno, op->bytes, op->packetno, op->granulepos); } Modified: branches/team/elbunce/iaxclient/simpleclient/stresstest/stresstest.c =================================================================== --- branches/team/elbunce/iaxclient/simpleclient/stresstest/stresstest.c 2010-01-29 17:41:25 UTC (rev 1463) +++ branches/team/elbunce/iaxclient/simpleclient/stresstest/stresstest.c 2010-02-02 14:48:34 UTC (rev 1464) @@ -69,8 +69,9 @@ static int fragsize = 1400; static int call_established = 0; -static int running = 0; +static int running = 1; +static int camera_enabled_sent = 0; static int send_video = 1; static int send_audio = 1; static int print_netstats = 0; @@ -221,27 +222,31 @@ return 0; } -void process_text_message(char *message) +void process_text_message(const char * message) { unsigned int prefs; + const char ctrl_str[] = "CONTROL:"; + const int ctrl_strlen = strlen(ctrl_str); - if ( strncmp(message, "CONTROL:", strlen("CONTROL:")) == 0 ) + if ( strncmp(message, ctrl_str, ctrl_strlen) == 0 ) { - message += strlen("CONTROL:"); + message += ctrl_strlen; if ( strcmp(message, "STOPVIDEO") == 0 ) { // Stop sending video prefs = iaxc_get_video_prefs(); prefs = prefs | IAXC_VIDEO_PREF_SEND_DISABLE ; iaxc_set_video_prefs(prefs); - } else if ( strcmp(message, "STARTVIDEO") == 0 ) + } + else if ( strcmp(message, "STARTVIDEO") == 0 ) { // Start sending video prefs = iaxc_get_video_prefs(); prefs = prefs & ~IAXC_VIDEO_PREF_SEND_DISABLE ; iaxc_set_video_prefs(prefs); } - } else + } + else mylog("Text message received: %s\n", message); } @@ -534,8 +539,7 @@ // Wait for the call to be established; while ( !call_established && running ) { - struct timeval now; - now = get_now(); + struct timeval now = get_now(); if ( connect_timeout_ms > 0 && msecdiff(&start_time, &now) > connect_timeout_ms ) { @@ -546,7 +550,6 @@ iaxc_millisleep(5); } - running = 1; while ( running ) { struct timeval now = get_now(); @@ -571,7 +574,15 @@ if ( !loop && video_is_eos() ) break; if ( send_video && op != NULL && op->bytes > 0 ) + { + if ( !camera_enabled_sent ) + { + /* Let app_conference know that we can send video */ + iaxc_send_text("CONTROL:CAMERA_ENABLED"); + camera_enabled_sent = 1; + } iaxc_push_video(op->packet, op->bytes, 1); + } } // Tight spinloops are bad, mmmkay? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 17:41:31
|
Revision: 1463 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1463&view=rev Author: bcholew Date: 2010-01-29 17:41:25 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Remove requirement for an audio input device. Modified Paths: -------------- trunk/lib/audio_portaudio.c Modified: trunk/lib/audio_portaudio.c =================================================================== --- trunk/lib/audio_portaudio.c 2010-01-29 15:50:24 UTC (rev 1462) +++ trunk/lib/audio_portaudio.c 2010-01-29 17:41:25 UTC (rev 1463) @@ -455,51 +455,67 @@ return 0; } +// NOTE: pa_open does not require an input device for success static int pa_open(int single, int inMono, int outMono) { PaError err; - PaDeviceInfo *result; + PaDeviceInfo *in_dev_info, *out_dev_info; - struct PaStreamParameters in_stream_params, out_stream_params, no_device; + struct PaStreamParameters in_stream_params, out_stream_params, *in_params; + + if ( selectedInput != paNoDevice ) + { + in_dev_info = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); + if ( in_dev_info == NULL ) + return -1; + in_stream_params.device = selectedInput; in_stream_params.channelCount = (inMono ? 1 : 2); in_stream_params.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); - if ( result == NULL ) return -1; - in_stream_params.suggestedLatency = result->defaultLowInputLatency; + in_stream_params.suggestedLatency = in_dev_info->defaultLowInputLatency; in_stream_params.hostApiSpecificStreamInfo = NULL; + in_params = &in_stream_params; + } + else + in_params = NULL; + + out_dev_info = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedOutput); + if ( out_dev_info == NULL ) + return -1; + out_stream_params.device = selectedOutput; out_stream_params.channelCount = (outMono ? 1 : 2); out_stream_params.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedOutput); - if ( result == NULL ) return -1; - out_stream_params.suggestedLatency = result->defaultLowOutputLatency; + out_stream_params.suggestedLatency = out_dev_info->defaultLowOutputLatency; out_stream_params.hostApiSpecificStreamInfo = NULL; - no_device.device = paNoDevice; - no_device.channelCount = 0; - no_device.sampleFormat = paInt16; - result = (PaDeviceInfo *)Pa_GetDeviceInfo(selectedInput); - if ( result == NULL ) return -1; - no_device.suggestedLatency = result->defaultLowInputLatency; // FEEDBACK - unsure if appropriate - no_device.hostApiSpecificStreamInfo = NULL; - - if ( single ) + // if there is no input device, there's no point in dual streams + if ( single || selectedInput == paNoDevice ) { - err = Pa_OpenStream(&iStream, - &in_stream_params, + err = Pa_OpenStream(&oStream, + in_params, &out_stream_params, iaxci_sample_rate, SAMPLES_PER_FRAME, paNoFlag, (PaStreamCallback *)pa_callback, NULL); - if (err != paNoError) return -1; - oStream = iStream; + if (err != paNoError) + return -1; + + iStream = oStream; oneStream = 1; } else { + struct PaStreamParameters no_device; + + no_device.device = paNoDevice; + no_device.channelCount = 0; + no_device.sampleFormat = paInt16; + no_device.suggestedLatency = in_dev_info->defaultLowInputLatency; // FEEDBACK - unsure if appropriate + no_device.hostApiSpecificStreamInfo = NULL; + err = Pa_OpenStream(&iStream, &in_stream_params, &no_device, @@ -508,7 +524,8 @@ paNoFlag, (PaStreamCallback *)pa_callback, NULL); - if ( err != paNoError ) return -1; + if ( err != paNoError ) + return -1; err = Pa_OpenStream(&oStream, &no_device, @@ -666,19 +683,28 @@ if ( pa_openstreams(d) ) return -1; - if ( Pa_StartStream(iStream) != paNoError ) + if ( selectedInput == paNoDevice ) + { + if ( Pa_StartStream(oStream) != paNoError ) return -1; + oMixer = Px_OpenMixer(oStream, 0); + } + else + { + if ( Pa_StartStream(iStream) != paNoError ) + return -1; + iMixer = Px_OpenMixer(iStream, 0); if ( !oneStream ) { - PaError err = Pa_StartStream(oStream); - oMixer = Px_OpenMixer(oStream, 0); - if ( err != paNoError ) + if ( Pa_StartStream(oStream) != paNoError ) { Pa_StopStream(iStream); return -1; + } + oMixer = Px_OpenMixer(oStream, 0); } } @@ -746,13 +772,13 @@ if ( sounds ) return 0; - err = Pa_AbortStream(iStream); - err = Pa_CloseStream(iStream); + err = Pa_AbortStream(oStream); + err = Pa_CloseStream(oStream); if ( !oneStream ) { - err = Pa_AbortStream(oStream); - err = Pa_CloseStream(oStream); + err = Pa_AbortStream(iStream); + err = Pa_CloseStream(iStream); } if ( auxStream ) @@ -769,8 +795,8 @@ * I bet if it's gone, no one will miss it. Such a cold, cold world! static void pa_shutdown() { - CloseAudioStream( iStream ); - if(!oneStream) CloseAudioStream( oStream ); + CloseAudioStream( oStream ); + if(!oneStream) CloseAudioStream( iStream ); if(auxStream) CloseAudioStream( aStream ); } */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 15:50:48
|
Revision: 1462 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1462&view=rev Author: bcholew Date: 2010-01-29 15:50:24 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Iaxclient now refrains from decoding a theora frame from a new video source (sender) until a keyframe arrives. This avoids visual artifacts from applying new-source p-frame changes to the final image from the previous source. Modified Paths: -------------- trunk/lib/codec_theora.c Modified: trunk/lib/codec_theora.c =================================================================== --- trunk/lib/codec_theora.c 2010-01-29 15:29:04 UTC (rev 1461) +++ trunk/lib/codec_theora.c 2010-01-29 15:50:24 UTC (rev 1462) @@ -66,6 +66,7 @@ theora_comment tc; struct deslicer_context *dsc; int got_key_frame; + unsigned short prev_src_id; }; struct theora_encoder @@ -143,8 +144,12 @@ op.bytes = flen; op.packet = (unsigned char *)frame; - /* reject all incoming frames until we get a key frame */ - if ( !d->got_key_frame ) + /* Reject all incoming frames until we get a key frame. + * Similarly, check for a change in who is sending the video. + * We shouldn't use frames from a new source until + * we get a keyframe + */ + if ( !d->got_key_frame || d->prev_src_id != d->dsc->source_id ) { if ( theora_packet_iskeyframe(&op) ) d->got_key_frame = 1; @@ -179,6 +184,10 @@ return -1; } + // keep track of the source id (from the most + // recent valid desliced frame) to detect a switch + d->prev_src_id = d->dsc->source_id; + //clear output memset(out, 127, my_out_len); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 15:29:11
|
Revision: 1461 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1461&view=rev Author: bcholew Date: 2010-01-29 15:29:04 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Increase de/slicer constants to handle at least 512kbps. Update comments to complain, but not fix. Modified Paths: -------------- trunk/lib/iaxclient_lib.h trunk/lib/slice.h Modified: trunk/lib/iaxclient_lib.h =================================================================== --- trunk/lib/iaxclient_lib.h 2010-01-29 15:24:33 UTC (rev 1460) +++ trunk/lib/iaxclient_lib.h 2010-01-29 15:29:04 UTC (rev 1461) @@ -170,8 +170,10 @@ void (*destroy) ( struct iaxc_audio_codec *codec); }; +//FIXME: This is all very static. What of higher +// bitrates, that require more slices? #define MAX_TRUNK_LEN (1<<16) -#define MAX_NO_SLICES 32 +#define MAX_NO_SLICES 64 struct slice_set_t { Modified: trunk/lib/slice.h =================================================================== --- trunk/lib/slice.h 2010-01-29 15:24:33 UTC (rev 1460) +++ trunk/lib/slice.h 2010-01-29 15:29:04 UTC (rev 1461) @@ -39,7 +39,12 @@ #include "iaxclient_lib.h" -#define MAX_ENCODED_FRAME_SIZE 48 * 1024 +// We don't bother deslicing frames larger than this, +// but we DO slice-up frames as long as they don't exceed +// MAX_NO_SLICES, each up to MAX_TRUNK_LEN long +// ( see definition of struct slice_set_t ) +//FIXME: this doesn't depend on the bitrate +#define MAX_ENCODED_FRAME_SIZE 96 * 1024 struct slicer_context { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 15:24:41
|
Revision: 1460 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1460&view=rev Author: bcholew Date: 2010-01-29 15:24:33 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Check for, and handle, slicer failures. Modified Paths: -------------- trunk/lib/codec_theora.c trunk/lib/video.c Modified: trunk/lib/codec_theora.c =================================================================== --- trunk/lib/codec_theora.c 2010-01-29 15:21:03 UTC (rev 1459) +++ trunk/lib/codec_theora.c 2010-01-29 15:24:33 UTC (rev 1460) @@ -306,7 +306,11 @@ slice_set->key_frame = theora_packet_iskeyframe(&op) == 1; // Slice the frame - slice((char *)op.packet, op.bytes, slice_set, e->sc); + if ( slice((char *)op.packet, op.bytes, slice_set, e->sc) ) + { + fprintf(stderr, "codec_theora: failed to slice an encoded packet\n"); + return -1; + } return 0; } Modified: trunk/lib/video.c =================================================================== --- trunk/lib/video.c 2010-01-29 15:21:03 UTC (rev 1459) +++ trunk/lib/video.c 2010-01-29 15:24:33 UTC (rev 1460) @@ -1830,7 +1830,14 @@ vinfo.sc = create_slicer_context((unsigned short)rand(), vfinfo.fragsize); - slice(data, size, &slice_set, vinfo.sc); + if ( slice(data, size, &slice_set, vinfo.sc) ) + { + fprintf(stderr, "iaxc_push_video: Failed to slice frame," + " call %d, size %d\n", + selected_call, size); + return -1; + } + for ( i = 0 ; i < slice_set.num_slices ; i++ ) { if ( iax_send_video_trunk(call->session, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 15:21:10
|
Revision: 1459 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1459&view=rev Author: bcholew Date: 2010-01-29 15:21:03 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Avoid crash in slicer for larger-than-expected theora frames. Correctly handle slicing 0-byte theora frames. Increase de/slicer verbosity a smidge. Modified Paths: -------------- trunk/lib/slice.c Modified: trunk/lib/slice.c =================================================================== --- trunk/lib/slice.c 2010-01-29 14:42:28 UTC (rev 1458) +++ trunk/lib/slice.c 2010-01-29 15:21:03 UTC (rev 1459) @@ -41,10 +41,30 @@ int i, ssize; if ( data == NULL || slice_set == NULL || sc == NULL) + { + fprintf(stderr, "slice: invalid param(s): data=%p, set=%p, context=%p\n", + data, slice_set, sc); return -1; + } + // Theora packets can be 0-byte (delta-frame with no coded blocks) + if ( size ) + { // Figure out how many slices we need slice_set->num_slices = (size - 1) / sc->slice_size + 1; + + if ( slice_set->num_slices > MAX_NO_SLICES ) + { + fprintf(stderr, "slice: %d-byte frame is too large " + "- would require %d slices\n", + size, slice_set->num_slices); + return -1; + } + } + else + { + slice_set->num_slices = 1; + } for ( i = 0; i < slice_set->num_slices; i++ ) { @@ -165,6 +185,8 @@ if ( dsc->slice_size * slice_index + inlen > MAX_ENCODED_FRAME_SIZE ) { // Frame would be too large, ignore slice + fprintf(stderr, "deslice: dropping frame that's > %d bytes\n", + MAX_ENCODED_FRAME_SIZE); *frames_dropped = 1; return NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-29 14:42:41
|
Revision: 1458 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1458&view=rev Author: bcholew Date: 2010-01-29 14:42:28 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Oops. Get the frames_dropped count right. Modified Paths: -------------- trunk/lib/slice.c Modified: trunk/lib/slice.c =================================================================== --- trunk/lib/slice.c 2010-01-28 22:10:28 UTC (rev 1457) +++ trunk/lib/slice.c 2010-01-29 14:42:28 UTC (rev 1458) @@ -141,11 +141,14 @@ /* Slice belongs to a new frame */ dsc->frame_index = frame_index; + *frames_dropped += frame_delta - 1; + if ( dsc->slice_count > 0 ) { /* Current frame is incomplete, drop it */ reset_deslicer_context(dsc); - *frames_dropped += frame_delta; + + *frames_dropped += 1; } } } else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-28 22:10:38
|
Revision: 1457 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1457&view=rev Author: bcholew Date: 2010-01-28 22:10:28 +0000 (Thu, 28 Jan 2010) Log Message: ----------- Fix for the 'dropped_frames' video statistics bucket (in struct iaxc_video_stats). Previously, this bucket wasn't being incremented. [Not tested for ffmpeg] Modified Paths: -------------- trunk/lib/codec_ffmpeg.c trunk/lib/codec_theora.c trunk/lib/iaxclient_lib.h trunk/lib/slice.c trunk/lib/slice.h trunk/lib/video.c Modified: trunk/lib/codec_ffmpeg.c =================================================================== --- trunk/lib/codec_ffmpeg.c 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/codec_ffmpeg.c 2010-01-28 22:10:28 UTC (rev 1457) @@ -209,7 +209,7 @@ } static int decode_iaxc_slice(struct iaxc_video_codec * c, int inlen, - char * in, int * outlen, char * out) + char * in, int * outlen, char * out, int * frames_dropped) { struct decoder_ctx *d = (struct decoder_ctx *) c->decstate; struct slice_header_t * sh_saved = &d->slice_header; @@ -217,10 +217,15 @@ char * inp; int ret; + *frames_dropped = 0; + inp = parse_slice_header(in, &sh_this); if ( !inp ) + { + *frames_dropped = 1; return -1; + } inlen -= inp - in; @@ -237,6 +242,8 @@ } else if ( frame_delta > 0 ) { + *frames_dropped = frame_delta - 1; + /* This slice belongs to a future frame */ if ( sh_saved->slice_index > 0 ) { @@ -254,7 +261,10 @@ reset_decoder_frame_state(d); if ( ret ) + { + *frames_dropped += 1; return -1; + } } sh_saved->frame_index = sh_this.frame_index; @@ -272,6 +282,7 @@ { fprintf(stderr, "codec_ffmpeg: decode: slice overflows decoder frame buffer\n"); + *frames_dropped = 1; return -1; } @@ -294,7 +305,10 @@ reset_decoder_frame_state(d); if ( ret ) + { + *frames_dropped = 1; return -1; + } return 0; } Modified: trunk/lib/codec_theora.c =================================================================== --- trunk/lib/codec_theora.c 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/codec_theora.c 2010-01-28 22:10:28 UTC (rev 1457) @@ -112,7 +112,7 @@ } static int decode(struct iaxc_video_codec *c, int inlen, const char *in, - int *outlen, char *out) + int *outlen, char *out, int * frames_dropped) { struct theora_decoder *d; ogg_packet op; @@ -123,6 +123,8 @@ int flen; char *frame; + *frames_dropped = 0; + // Sanity checks if ( !c || !c->decstate || !in || inlen <= 0 || !out || !outlen ) return -1; @@ -132,7 +134,7 @@ if ( !d->dsc ) return -1; - frame = deslice(in, inlen, &flen, d->dsc); + frame = deslice(in, inlen, &flen, d->dsc, frames_dropped); if ( frame == NULL ) return 1; Modified: trunk/lib/iaxclient_lib.h =================================================================== --- trunk/lib/iaxclient_lib.h 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/iaxclient_lib.h 2010-01-28 22:10:28 UTC (rev 1457) @@ -196,7 +196,8 @@ int (*encode)(struct iaxc_video_codec * codec, int inlen, const char * in, struct slice_set_t * out); int (*decode)(struct iaxc_video_codec * codec, int inlen, - const char * in, int * outlen, char * out); + const char * in, int * outlen, char * out, + int * frames_dropped); void (*destroy)(struct iaxc_video_codec * codec); }; Modified: trunk/lib/slice.c =================================================================== --- trunk/lib/slice.c 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/slice.c 2010-01-28 22:10:28 UTC (rev 1457) @@ -94,11 +94,13 @@ } char * -deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc) +deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc, int *frames_dropped) { unsigned char frame_index, slice_index, num_slices, version; unsigned short source_id; + *frames_dropped = 0; + // Sanity checks if ( dsc == NULL || in == NULL || inlen <= 0 || outlen == NULL ) return NULL; @@ -143,6 +145,7 @@ { /* Current frame is incomplete, drop it */ reset_deslicer_context(dsc); + *frames_dropped += frame_delta; } } } else @@ -159,6 +162,7 @@ if ( dsc->slice_size * slice_index + inlen > MAX_ENCODED_FRAME_SIZE ) { // Frame would be too large, ignore slice + *frames_dropped = 1; return NULL; } Modified: trunk/lib/slice.h =================================================================== --- trunk/lib/slice.h 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/slice.h 2010-01-28 22:10:28 UTC (rev 1457) @@ -104,6 +104,7 @@ * outlen with the frame size if successful */ char * -deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc); +deslice(const char *in, int inlen, int *outlen, struct deslicer_context *dsc, + int * frames_dropped); #endif Modified: trunk/lib/video.c =================================================================== --- trunk/lib/video.c 2010-01-28 21:48:15 UTC (rev 1456) +++ trunk/lib/video.c 2010-01-28 22:10:28 UTC (rev 1457) @@ -1259,6 +1259,7 @@ int ret; struct timeval now; long time; + int frames_dropped; if ( !call ) return 0; @@ -1315,8 +1316,10 @@ call->vdecoder->video_stats.acc_recv_size * 8000 / time; ret = call->vdecoder->decode(call->vdecoder, encoded_video_len, - (char *)encoded_video, &out_size, yuv_buf); + (char *)encoded_video, &out_size, yuv_buf, &frames_dropped); + call->vdecoder->video_stats.dropped_frames += (unsigned long) frames_dropped; + if ( ret < 0 ) { fprintf(stderr, "ERROR: decode error\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-28 21:48:24
|
Revision: 1456 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1456&view=rev Author: bcholew Date: 2010-01-28 21:48:15 +0000 (Thu, 28 Jan 2010) Log Message: ----------- small typo Modified Paths: -------------- trunk/lib/iaxclient.h Modified: trunk/lib/iaxclient.h =================================================================== --- trunk/lib/iaxclient.h 2010-01-28 21:45:31 UTC (rev 1455) +++ trunk/lib/iaxclient.h 2010-01-28 21:48:15 UTC (rev 1456) @@ -247,7 +247,7 @@ int format; /*! - The audio format of the call. + The video format of the call. \see IAXC_FORMAT_JPEG, IAXC_FORMAT_PNG, IAXC_FORMAT_H261, IAXC_FORMAT_H263, IAXC_FORMAT_H263_PLUS, IAXC_FORMAT_H264, IAXC_FORMAT_MPEG4, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bc...@us...> - 2010-01-28 21:45:37
|
Revision: 1455 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1455&view=rev Author: bcholew Date: 2010-01-28 21:45:31 +0000 (Thu, 28 Jan 2010) Log Message: ----------- Fix a couple problems in stresstest - courtesy of Pete Grayson: - Initialize the running flag to true instead of false. Without this flag set, stresstest will fail to wait until the call is established to start sending audio and video frames. This is not generally fatal to the call, but it is bad protocol and a poor approximation of what a more robust iaxclient app would do. - Send "CONTROL:CAMERA_ENABLED" text message prior to sending video frames. This message is interpreted by app_conference. If it is not sent, app_conference will not switch the conference's video to the stresstest conference member. - Fix compiler warnings in file.c. Modified Paths: -------------- trunk/simpleclient/stresstest/file.c trunk/simpleclient/stresstest/stresstest.c Modified: trunk/simpleclient/stresstest/file.c =================================================================== --- trunk/simpleclient/stresstest/file.c 2008-11-10 20:21:46 UTC (rev 1454) +++ trunk/simpleclient/stresstest/file.c 2010-01-28 21:45:31 UTC (rev 1455) @@ -199,8 +199,8 @@ read_speex_cb(oggz, op, serialno, data); } else { - mylog("Got unknown ogg packet, serialno=%d, size=%d, " - "packetno=%d, granulepos=%d\n", + mylog("Got unknown ogg packet, serialno=%ld, size=%ld, " + "packetno=%lld, granulepos=%lld\n", serialno, op->bytes, op->packetno, op->granulepos); } Modified: trunk/simpleclient/stresstest/stresstest.c =================================================================== --- trunk/simpleclient/stresstest/stresstest.c 2008-11-10 20:21:46 UTC (rev 1454) +++ trunk/simpleclient/stresstest/stresstest.c 2010-01-28 21:45:31 UTC (rev 1455) @@ -69,8 +69,9 @@ static int fragsize = 1400; static int call_established = 0; -static int running = 0; +static int running = 1; +static int camera_enabled_sent = 0; static int send_video = 1; static int send_audio = 1; static int print_netstats = 0; @@ -221,27 +222,31 @@ return 0; } -void process_text_message(char *message) +void process_text_message(const char * message) { unsigned int prefs; + const char ctrl_str[] = "CONTROL:"; + const int ctrl_strlen = strlen(ctrl_str); - if ( strncmp(message, "CONTROL:", strlen("CONTROL:")) == 0 ) + if ( strncmp(message, ctrl_str, ctrl_strlen) == 0 ) { - message += strlen("CONTROL:"); + message += ctrl_strlen; if ( strcmp(message, "STOPVIDEO") == 0 ) { // Stop sending video prefs = iaxc_get_video_prefs(); prefs = prefs | IAXC_VIDEO_PREF_SEND_DISABLE ; iaxc_set_video_prefs(prefs); - } else if ( strcmp(message, "STARTVIDEO") == 0 ) + } + else if ( strcmp(message, "STARTVIDEO") == 0 ) { // Start sending video prefs = iaxc_get_video_prefs(); prefs = prefs & ~IAXC_VIDEO_PREF_SEND_DISABLE ; iaxc_set_video_prefs(prefs); } - } else + } + else mylog("Text message received: %s\n", message); } @@ -534,8 +539,7 @@ // Wait for the call to be established; while ( !call_established && running ) { - struct timeval now; - now = get_now(); + struct timeval now = get_now(); if ( connect_timeout_ms > 0 && msecdiff(&start_time, &now) > connect_timeout_ms ) { @@ -546,7 +550,6 @@ iaxc_millisleep(5); } - running = 1; while ( running ) { struct timeval now = get_now(); @@ -571,7 +574,15 @@ if ( !loop && video_is_eos() ) break; if ( send_video && op != NULL && op->bytes > 0 ) + { + if ( !camera_enabled_sent ) + { + /* Let app_conference know that we can send video */ + iaxc_send_text("CONTROL:CAMERA_ENABLED"); + camera_enabled_sent = 1; + } iaxc_push_video(op->packet, op->bytes, 1); + } } // Tight spinloops are bad, mmmkay? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: 史煜青 <je...@ho...> - 2009-08-17 11:16:52
|
Hi everyone, I want to cross compile iaxclient to wince.I do some methods but fails anyway. here is my steps: 1 I setup cygwin and download 'cygwin-cegcc-mingw32ce-0.51.0-1.tar.gz' and release them to cygwin folder 2 I cross compile speex libogg libtheora and portaudio success (i can find *.dll file in /usr/local/bin folder) now i want to compile iaxclient I open the cygwin shell ,cd into the iaxclient folder and build with: $ CXX=arm-wince-mingw32ce-g++ ./configure --build=i686-pc-cygwin --host=arm-wince-mingw32ce --target=arm-wince-mingw32ce --enable-local-gsm --disable-gsmtest --enable-libogg --enable-libtheora --enable-libspeex --enable-libportaudio --enable-shared --enable-static --with-gnu-ld here is the result checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for arm-wince-mingw32ce-strip... arm-wince-mingw32ce-strip checking whether to enable maintainer-specific portions of Makefiles... no checking build system type... i686-pc-cygwin checking host system type... arm-wince-mingw32ce checking for arm-wince-mingw32ce-gcc... arm-wince-mingw32ce-gcc checking for C compiler default output file name... a.exe checking whether the C compiler works... yes checking whether we are cross compiling... yes checking for suffix of executables... .exe checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether arm-wince-mingw32ce-gcc accepts -g... yes checking for arm-wince-mingw32ce-gcc option to accept ISO C89... none needed checking for style of include used by make... GNU checking dependency style of arm-wince-mingw32ce-gcc... gcc3 checking whether arm-wince-mingw32ce-gcc and cc understand -c and -o together... yes checking how to run the C preprocessor... arm-wince-mingw32ce-gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking whether arm-wince-mingw32ce-gcc needs -traditional... no checking whether we are using the GNU C++ compiler... yes checking whether arm-wince-mingw32ce-g++ accepts -g... yes checking dependency style of arm-wince-mingw32ce-g++... gcc3 checking for a BSD-compatible install... /usr/bin/install -c checking for a sed that does not truncate output... /usr/bin/sed checking for ld used by arm-wince-mingw32ce-gcc... /opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe checking if the linker (/opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe) is GNU ld... yes checking for /opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe option to reload object files... -r checking for BSD-compatible nm... /opt/mingw32ce/bin/arm-wince-mingw32ce-nm -B checking whether ln -s works... yes checking how to recognize dependent libraries... file_magic file format pei*-i386(.*architecture: i3 86)? checking for arm-wince-mingw32ce-dlltool... arm-wince-mingw32ce-dlltool checking for arm-wince-mingw32ce-as... arm-wince-mingw32ce-as checking for arm-wince-mingw32ce-objdump... arm-wince-mingw32ce-objdump checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking dlfcn.h usability... yes checking dlfcn.h presence... yes checking for dlfcn.h... yes checking how to run the C++ preprocessor... arm-wince-mingw32ce-g++ -E checking for arm-wince-mingw32ce-g77... no checking for arm-wince-mingw32ce-xlf... no checking for arm-wince-mingw32ce-f77... no checking for arm-wince-mingw32ce-frt... no checking for arm-wince-mingw32ce-pgf77... no checking for arm-wince-mingw32ce-cf77... no checking for arm-wince-mingw32ce-fort77... no checking for arm-wince-mingw32ce-fl32... no checking for arm-wince-mingw32ce-af77... no checking for arm-wince-mingw32ce-xlf90... no checking for arm-wince-mingw32ce-f90... no checking for arm-wince-mingw32ce-pgf90... no checking for arm-wince-mingw32ce-pghpf... no checking for arm-wince-mingw32ce-epcf90... no checking for arm-wince-mingw32ce-gfortran... no checking for arm-wince-mingw32ce-g95... no checking for arm-wince-mingw32ce-xlf95... no checking for arm-wince-mingw32ce-f95... no checking for arm-wince-mingw32ce-fort... no checking for arm-wince-mingw32ce-ifort... no checking for arm-wince-mingw32ce-ifc... no checking for arm-wince-mingw32ce-efc... no checking for arm-wince-mingw32ce-pgf95... no checking for arm-wince-mingw32ce-lf95... no checking for arm-wince-mingw32ce-ftn... no checking for g77... no checking for xlf... no checking for f77... no checking for frt... no checking for pgf77... no checking for cf77... no checking for fort77... no checking for fl32... no checking for af77... no checking for xlf90... no checking for f90... no checking for pgf90... no checking for pghpf... no checking for epcf90... no checking for gfortran... no checking for g95... no checking for xlf95... no checking for f95... no checking for fort... no checking for ifort... no checking for ifc... no checking for efc... no checking for pgf95... no checking for lf95... no checking for ftn... no checking whether we are using the GNU Fortran 77 compiler... no checking whether accepts -g... no checking the maximum length of command line arguments... 8192 checking command to parse /opt/mingw32ce/bin/arm-wince-mingw32ce-nm -B output from arm-wince-mingw32 ce-gcc object... ok checking for objdir... .libs checking for arm-wince-mingw32ce-ar... arm-wince-mingw32ce-ar checking for arm-wince-mingw32ce-ranlib... arm-wince-mingw32ce-ranlib checking for arm-wince-mingw32ce-strip... (cached) arm-wince-mingw32ce-strip checking if arm-wince-mingw32ce-gcc supports -fno-rtti -fno-exceptions... no checking for arm-wince-mingw32ce-gcc option to produce PIC... -DDLL_EXPORT checking if arm-wince-mingw32ce-gcc PIC flag -DDLL_EXPORT works... yes checking if arm-wince-mingw32ce-gcc static flag -static works... yes checking if arm-wince-mingw32ce-gcc supports -c -o file.o... yes checking whether the arm-wince-mingw32ce-gcc linker (/opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe) supports shared libraries... yes checking whether -lc should be explicitly linked in... yes checking dynamic linker characteristics... Win32 ld.exe checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes configure: creating libtool appending configuration tag "CXX" to libtool checking for ld used by arm-wince-mingw32ce-g++... /opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe checking if the linker (/opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe) is GNU ld... yes checking whether the arm-wince-mingw32ce-g++ linker (/opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe) supports shared libraries... yes checking for arm-wince-mingw32ce-g++ option to produce PIC... -DDLL_EXPORT checking if arm-wince-mingw32ce-g++ PIC flag -DDLL_EXPORT works... yes checking if arm-wince-mingw32ce-g++ static flag -static works... yes checking if arm-wince-mingw32ce-g++ supports -c -o file.o... yes checking whether the arm-wince-mingw32ce-g++ linker (/opt/mingw32ce/arm-wince-mingw32ce/bin/ld.exe) supports shared libraries... yes checking dynamic linker characteristics... Win32 ld.exe checking how to hardcode library paths into programs... immediate appending configuration tag "F77" to libtool checking for ANSI C header files... (cached) yes checking for stdbool.h that conforms to C99... yes checking for _Bool... yes checking whether time.h and sys/time.h may both be included... yes checking sys/time.h usability... yes checking sys/time.h presence... yes checking for sys/time.h... yes checking varargs.h usability... no checking varargs.h presence... no checking for varargs.h... no checking sys/socket.h usability... no checking sys/socket.h presence... no checking for sys/socket.h... no checking for an ANSI C-conforming const... yes checking for inline... inline checking for working volatile... yes checking for pid_t... yes checking for size_t... yes checking for vsnprintf... yes checking for _vsnprintf... yes checking for the pthreads library -lpthreads... no checking whether pthreads work without any flags... no checking whether pthreads work with -Kthread... no checking whether pthreads work with -kthread... no checking for the pthreads library -llthread... no checking whether pthreads work with -pthread... no checking whether pthreads work with -pthreads... no checking whether pthreads work with -mthreads... no checking for the pthreads library -lpthread... no checking whether pthreads work with --thread-safe... no checking whether pthreads work with -mt... no checking for pthread-config... no checking for pkg-config... yes checking for arm-wince-mingw32ce-pkg-config... no checking for pkg-config... /usr/bin/pkg-config configure: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to aut...@gn.... checking pkg-config is at least version 0.9.0... yes checking for wish... /usr/bin/wish checking for iLBC reference sources in lib/iLBC... no checking for PORTAUDIO... yes checking for OGG... yes checking for SPEEX... yes checking for THEORA... yes checking for SDL... no checking for GTK... no checking for GDK2... no checking for ALSA... no checking for wx-config... no checking for wx-config... (cached) no checking for wxrc... not found configure: creating ./config.status config.status: creating Makefile config.status: creating lib/Makefile config.status: creating simpleclient/Makefile config.status: creating iaxclient.pc config.status: creating simpleclient/testcall/Makefile config.status: creating simpleclient/vtestcall/Makefile config.status: creating simpleclient/iaxcomm/Makefile config.status: creating simpleclient/iaxphone/Makefile config.status: creating simpleclient/tkphone/Makefile config.status: creating simpleclient/WinIAX/Makefile config.status: creating simpleclient/wx/Makefile config.status: creating config.h config.status: config.h is unchanged config.status: executing depfiles commands configure: Configured clients: testcall WinIAX next , i do this : make && make install unfortunately, there is no libiaxlicent.dll in /usr/local/bin folder, but i find 'libiaxclient.a & libiaxclient.la' in lib folder i have been working on this more than a week i really need some help!! best regards advancers!! sorry I’m new to mailing lists so I wasn’t sure how to do handle that. thanks again! _________________________________________________________________ Messenger安全保护中心,免费修复系统漏洞,保护Messenger安全! http://im.live.cn/safe/ |
From: <do...@us...> - 2008-11-10 20:21:51
|
Revision: 1454 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1454&view=rev Author: dohpaz Date: 2008-11-10 20:21:46 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Add ability to dump calls with a reason. Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/iaxclient.h branches/team/elbunce/iaxclient/lib/iaxclient_lib.c Modified: branches/team/elbunce/iaxclient/lib/iaxclient.h =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-11-10 19:32:50 UTC (rev 1453) +++ branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-11-10 20:21:46 UTC (rev 1454) @@ -857,6 +857,13 @@ EXPORT void iaxc_dump_call_number( int callNo ); /*! + Hangs up and frees call \a callNo with \a reason + \param callNo The call number to reject. + \param reason The reason the call was dumped +*/ +EXPORT void iaxc_dump_call_number_ex( int callNo, const char* reason ); + +/*! Hangs up and frees the currently selected call. */ EXPORT void iaxc_dump_call(void); @@ -878,8 +885,9 @@ /*! Rejects the incoming call \a callNo. \param callNo The call number to reject. + \param reason */ -EXPORT void iaxc_reject_call_number_ex(int callNo, const char* reason); +EXPORT void iaxc_reject_call_number_ex( int callNo, const char* reason ); /*! Sends a DTMF digit to the currently selected call. Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.c =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-11-10 19:32:50 UTC (rev 1453) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-11-10 20:21:46 UTC (rev 1454) @@ -113,6 +113,7 @@ static void service_network(); static int service_audio(); +static void iaxc_dump_one_call(int callNo, const char* reason); /* external global networking replacements */ static iaxc_sendto_t iaxc_sendto = (iaxc_sendto_t)sendto; @@ -675,10 +676,13 @@ EXPORT void iaxc_shutdown() { - iaxc_dump_all_calls(); + int callNo; get_iaxc_lock(); + for ( callNo = 0; callNo < max_calls; callNo++ ) + iaxc_dump_one_call(callNo, "Shutdown Call"); + if ( !test_mode ) { audio_driver.destroy(&audio_driver); @@ -1552,14 +1556,14 @@ iaxc_dump_one_call dumps \a callNo. Expects the routine calling it to have obtained the iaxc lock. */ -static void iaxc_dump_one_call(int callNo) +static void iaxc_dump_one_call(int callNo, const char* reason) { if ( ( callNo < 0 ) || ( callNo >= max_calls ) || ( calls[callNo].state == IAXC_CALL_STATE_FREE ) ) return; - iax_hangup(calls[callNo].session,"Dumped Call"); - iaxci_usermsg(IAXC_STATUS, "Hanging up call %d", callNo); + iax_hangup(calls[callNo].session, reason); + iaxci_usermsg(IAXC_STATUS, "Hanging up call %d: %s", callNo, reason); iaxc_clear_call(callNo); } @@ -1568,7 +1572,7 @@ int callNo; get_iaxc_lock(); for ( callNo = 0; callNo < max_calls; callNo++ ) - iaxc_dump_one_call(callNo); + iaxc_dump_one_call(callNo, "Dumping All Calls"); put_iaxc_lock(); } @@ -1578,17 +1582,28 @@ if ( callNo >= 0 && callNo < max_calls ) { get_iaxc_lock(); - iaxc_dump_one_call(callNo); + iaxc_dump_one_call(callNo, "Dumped Call"); put_iaxc_lock(); } } + +EXPORT void iaxc_dump_call_number_ex( int callNo, const char* reason ) +{ + if ( callNo >= 0 && callNo < max_calls ) + { + get_iaxc_lock(); + iaxc_dump_one_call(callNo, reason ? reason : "Dumped Call"); + put_iaxc_lock(); + } +} + EXPORT void iaxc_dump_call(void) { if ( selected_call >= 0 ) { get_iaxc_lock(); - iaxc_dump_one_call(selected_call); + iaxc_dump_one_call(selected_call, "Dumped Call"); put_iaxc_lock(); } } @@ -1613,7 +1628,7 @@ return; get_iaxc_lock(); - iax_reject(calls[callNo].session, reason); + iax_reject(calls[callNo].session, reason ? reason : "Call rejected manually"); iaxc_clear_call(callNo); put_iaxc_lock(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <do...@us...> - 2008-11-10 19:32:53
|
Revision: 1453 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1453&view=rev Author: dohpaz Date: 2008-11-10 19:32:50 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Add iaxc_reject_call_number_ex() API so we can pass in a reason. Include the call number in more of the call status messages. Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/iaxclient.h branches/team/elbunce/iaxclient/lib/iaxclient_lib.c Modified: branches/team/elbunce/iaxclient/lib/iaxclient.h =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-11-03 20:16:06 UTC (rev 1452) +++ branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-11-10 19:32:50 UTC (rev 1453) @@ -876,6 +876,12 @@ EXPORT void iaxc_reject_call_number(int callNo); /*! + Rejects the incoming call \a callNo. + \param callNo The call number to reject. +*/ +EXPORT void iaxc_reject_call_number_ex(int callNo, const char* reason); + +/*! Sends a DTMF digit to the currently selected call. \param digit The DTMF digit to send (0-9, A-D, *, #). */ Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.c =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-11-03 20:16:06 UTC (rev 1452) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-11-10 19:32:50 UTC (rev 1453) @@ -1200,7 +1200,7 @@ case IAX_EVENT_NULL: break; case IAX_EVENT_HANGUP: - iaxci_usermsg(IAXC_STATUS, "Call disconnected by remote"); + iaxci_usermsg(IAXC_STATUS, "Call %d disconnected by remote", callNo); // XXX does the session go away now? iaxc_clear_call(callNo); break; @@ -1215,7 +1215,7 @@ iaxci_usermsg(IAXC_STATUS,"Call %d Radio Unkey", callNo); break; case IAX_EVENT_REJECT: - iaxci_usermsg(IAXC_STATUS, "Call rejected by remote"); + iaxci_usermsg(IAXC_STATUS, "Call %d rejected by remote", callNo); iaxc_clear_call(callNo); break; case IAX_EVENT_ACCEPT: @@ -1603,12 +1603,17 @@ EXPORT void iaxc_reject_call_number( int callNo ) { + iaxc_reject_call_number_ex(callNo, "Call rejected manually."); +} + +EXPORT void iaxc_reject_call_number_ex(int callNo, const char* reason) +{ if ( ( callNo < 0 ) || ( callNo >= max_calls ) || ( calls[callNo].state == IAXC_CALL_STATE_FREE ) ) return; get_iaxc_lock(); - iax_reject(calls[callNo].session, "Call rejected manually."); + iax_reject(calls[callNo].session, reason); iaxc_clear_call(callNo); put_iaxc_lock(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <do...@us...> - 2008-11-03 20:16:40
|
Revision: 1452 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1452&view=rev Author: dohpaz Date: 2008-11-03 20:16:06 +0000 (Mon, 03 Nov 2008) Log Message: ----------- Add better error / state checking to iaxc_answer_call() and add return value. Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/iaxclient.h branches/team/elbunce/iaxclient/lib/iaxclient_lib.c Modified: branches/team/elbunce/iaxclient/lib/iaxclient.h =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-08-26 18:01:51 UTC (rev 1451) +++ branches/team/elbunce/iaxclient/lib/iaxclient.h 2008-11-03 20:16:06 UTC (rev 1452) @@ -812,8 +812,10 @@ /*! Answers the incoming call \a callNo. \param callNo The number of the call to answer. + + \return 0 upon success; -1 otherwise */ -EXPORT void iaxc_answer_call(int callNo); +EXPORT int iaxc_answer_call(int callNo); /*! Radio Transmitter and Receiver Control Activiate @@ -880,7 +882,7 @@ EXPORT void iaxc_send_dtmf(char digit); /*! - Sends text to the currently selected call. + Sends \a text to the currently selected call. */ EXPORT void iaxc_send_text(const char * text); Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.c =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-08-26 18:01:51 UTC (rev 1451) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-11-03 20:16:06 UTC (rev 1452) @@ -1488,15 +1488,30 @@ iax_busy(calls[callNo].session); } -EXPORT void iaxc_answer_call(int callNo) +EXPORT int iaxc_answer_call(int callNo) { - if ( callNo < 0 ) - return; + /* default result of success */ + int res = 0; - calls[callNo].state |= IAXC_CALL_STATE_COMPLETE; - calls[callNo].state &= ~IAXC_CALL_STATE_RINGING; - iax_answer(calls[callNo].session); - iaxci_do_state_callback(callNo); + /* Make sure call is valid, within range */ + if ( ( callNo < 0 ) || ( callNo >= max_calls ) ) + return -1; + + get_iaxc_lock(); + /* make sure this isn't free and not-outgoing */ + if ( ( calls[callNo].state != IAXC_CALL_STATE_FREE ) && + ! ( calls[callNo].state & IAXC_CALL_STATE_OUTGOING ) ) + { + calls[callNo].state |= IAXC_CALL_STATE_COMPLETE; + calls[callNo].state &= ~IAXC_CALL_STATE_RINGING; + iax_answer(calls[callNo].session); + iaxci_do_state_callback(callNo); + } + else + res = -1; + + put_iaxc_lock(); + return res; } EXPORT void iaxc_key_radio(int callNo) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sb...@us...> - 2008-08-26 18:01:40
|
Revision: 1451 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1451&view=rev Author: sbalea Date: 2008-08-26 18:01:51 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Fix crash in iax_handle_vnak caused by Pete's code cleanup changes. Hint: the NULL check will short circuit the rest of the expression if item->next is NULL, thus avoiding crashage Modified Paths: -------------- trunk/lib/libiax2/src/iax.c Modified: trunk/lib/libiax2/src/iax.c =================================================================== --- trunk/lib/libiax2/src/iax.c 2008-08-26 17:59:03 UTC (rev 1450) +++ trunk/lib/libiax2/src/iax.c 2008-08-26 18:01:51 UTC (rev 1451) @@ -2459,11 +2459,8 @@ struct iax_sched *item = retrans_list; while ( item != NULL ) { - const unsigned char next_seqno = - item->next->frame->oseqno - - session->rseqno; if ( item->next == NULL || - next_seqno > frame_seqno + item->next->frame->oseqno - session->rseqno > frame_seqno ) { tmp->next = item->next; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sb...@us...> - 2008-08-26 17:58:52
|
Revision: 1450 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1450&view=rev Author: sbalea Date: 2008-08-26 17:59:03 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Fix crash in iax_handle_vnak caused by Pete's code cleanup changes. Hint: the NULL check will short circuit the rest of the expression if item->next is NULL, thus avoiding crashage Modified Paths: -------------- branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c Modified: branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c =================================================================== --- branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c 2008-08-06 00:48:54 UTC (rev 1449) +++ branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c 2008-08-26 17:59:03 UTC (rev 1450) @@ -2463,11 +2463,8 @@ struct iax_sched *item = retrans_list; while ( item != NULL ) { - const unsigned char next_seqno = - item->next->frame->oseqno - - session->rseqno; if ( item->next == NULL || - next_seqno > frame_seqno + item->next->frame->oseqno - session->rseqno > frame_seqno ) { tmp->next = item->next; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <do...@us...> - 2008-08-06 00:48:49
|
Revision: 1449 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1449&view=rev Author: dohpaz Date: 2008-08-06 00:48:54 +0000 (Wed, 06 Aug 2008) Log Message: ----------- Merge up to trunk of r1448 Modified Paths: -------------- branches/team/elbunce/iaxclient/contrib/tcl/Makefile.macosx branches/team/elbunce/iaxclient/lib/audio_encode.c branches/team/elbunce/iaxclient/lib/audio_portaudio.c branches/team/elbunce/iaxclient/lib/iaxclient_lib.c branches/team/elbunce/iaxclient/lib/libiax2/src/frame.h branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c branches/team/elbunce/iaxclient/lib/libiax2/src/iax2-parser.c branches/team/elbunce/iaxclient/lib/libiax2/src/iax2-parser.h branches/team/elbunce/iaxclient/lib/unixfuncs.c branches/team/elbunce/iaxclient/simpleclient/stresstest/file.c branches/team/elbunce/iaxclient/simpleclient/stresstest/file.h branches/team/elbunce/iaxclient/simpleclient/stresstest/stresstest.c branches/team/elbunce/iaxclient/simpleclient/tkphone/Makefile.am Modified: branches/team/elbunce/iaxclient/contrib/tcl/Makefile.macosx =================================================================== --- branches/team/elbunce/iaxclient/contrib/tcl/Makefile.macosx 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/contrib/tcl/Makefile.macosx 2008-08-06 00:48:54 UTC (rev 1449) @@ -9,7 +9,6 @@ CFLAGS:= $(CFLAGS) -g -Wall -O2 # debug flags -# CFLAGS := $(CFLAGS) -DDEBUG_SUPPORT -DDEBUG_DEFAULT -DEXTREME_DEBUG -D_DEBUG # CFLAGS := $(CFLAGS) -DDEBUG_SUPPORT -DDEBUG_DEFAULT -D_DEBUG OBJS=\ Modified: branches/team/elbunce/iaxclient/lib/audio_encode.c =================================================================== --- branches/team/elbunce/iaxclient/lib/audio_encode.c 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/lib/audio_encode.c 2008-08-06 00:48:54 UTC (rev 1449) @@ -41,7 +41,7 @@ #include "codec_ilbc.h" #endif -float iaxci_silence_threshold = AUDIO_ENCODE_SILENCE_DB; +static float iaxci_silence_threshold = AUDIO_ENCODE_SILENCE_DB; static float input_level = 0.0f; static float output_level = 0.0f; @@ -51,7 +51,11 @@ static SpeexPreprocessState *st = NULL; static int speex_state_size = 0; static int speex_state_rate = 0; -int iaxci_filters = IAXC_FILTER_AGC|IAXC_FILTER_DENOISE|IAXC_FILTER_AAGC|IAXC_FILTER_CN; +static int iaxci_filters = + IAXC_FILTER_AGC | + IAXC_FILTER_DENOISE | + IAXC_FILTER_AAGC | + IAXC_FILTER_CN; static MUTEX audio_lock; @@ -72,16 +76,6 @@ static char outRingBuf[EC_RING_SIZE]; #endif -/* AAGC threshold */ -#define AAGC_VERY_HOT 16 -#define AAGC_HOT 8 -#define AAGC_COLD 4 - -/* AAGC increments */ -#define AAGC_RISE_SLOW 0.10f -#define AAGC_DROP_SLOW 0.15f -#define AAGC_DROP_FAST 0.20f - /* use to measure time since last audio was processed */ static struct timeval timeLastInput ; static struct timeval timeLastOutput ; @@ -178,11 +172,17 @@ static int input_postprocess(short * audio, int len, int rate) { - static float lowest_volume = 1.0f; - float volume; - int silent = 0; + static int aagc_frame_count = 0; + static int aagc_periods_to_skip = 0; + const int using_vad = iaxci_silence_threshold > 0.0f; + const int aagc_period = rate / len; /* 1 second */ + + int speaking = 1; + int loudness = 0; + MUTEXLOCK(&audio_lock); + if ( !st || speex_state_size != len || speex_state_rate != rate ) { if (st) @@ -199,75 +199,114 @@ i = ECHO_SUPPRESS_ACTIVE; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE, &i); } -#endif +#endif speex_state_size = len; speex_state_rate = rate; set_speex_filters(); } + + /* go through the motions only if we need at least one of the + * preprocessor filters */ + if ( using_vad || (iaxci_filters & + (IAXC_FILTER_DENOISE | + IAXC_FILTER_AGC | + IAXC_FILTER_DEREVERB | + IAXC_FILTER_ECHO)) ) + { + speaking = speex_preprocess_run(st, audio); + speex_preprocess_ctl(st, SPEEX_PREPROCESS_GET_AGC_LOUDNESS, + &loudness); + } + MUTEXUNLOCK(&audio_lock); - calculate_level(audio, len, &input_level); + /* If we are using the VAD test and if speex indicates non-speaking, + * ignore the computed input level and indicate to the user that the + * input level was zero. + */ + if ( using_vad && !speaking ) + input_level = 0.0f; + else + calculate_level(audio, len, &input_level); - /* go through the motions only if we need at least one of the preprocessor filters */ - if ( (iaxci_filters & (IAXC_FILTER_DENOISE | IAXC_FILTER_AGC | IAXC_FILTER_DEREVERB | IAXC_FILTER_ECHO)) || - iaxci_silence_threshold > 0.0f ) - silent = !speex_preprocess(st, (spx_int16_t *)audio, NULL); - - /* Analog AGC: Bring speex AGC gain out to mixer, with lots of hysteresis */ - /* use a higher continuation threshold for AAGC than for VAD itself */ - if ( !silent && - iaxci_silence_threshold != 0.0f && - (iaxci_filters & IAXC_FILTER_AGC) && - (iaxci_filters & IAXC_FILTER_AAGC) - ) + /* Analog Automatic Gain Control, AAGC. */ + if ( speaking && iaxci_silence_threshold != 0.0f && + (iaxci_filters & IAXC_FILTER_AGC) && + (iaxci_filters & IAXC_FILTER_AAGC) && + ++aagc_frame_count % aagc_period == 0 && + !aagc_periods_to_skip-- ) { - static int i = 0; + /* This heuristic uses the loudness value from the speex + * preprocessor to determine a new mixer level. The loudness + * ranges from 0 to up over 80. When mixer level, speex AGC, + * and the actual speaker's level are in equilibrium, the + * loudness tends to be from 4 to 16. When the loudness goes + * above this comfortable range, there is a risk of the input + * signal being clipped. AAGC's primary purpose is to avoid + * clipping. + * + * After a loud event (think cough), the loudness level will + * spike and then decay over time (assuming the speaker + * speaking at a relatively constant level). To avoid + * over-adjusting, we skip some number of aagc sampling periods + * before making any more adjustments. This gives the loudness + * value time to normalize after one-time spikes in the input + * level. + */ - i++; + /* The mixer level is a percentage ranging from 0.00 to 1.00 */ + const float mixer_level = iaxc_input_level_get(); + float new_mixer_level = mixer_level; - if ( (i & 0x3f) == 0 ) + if ( loudness > 40 ) { - int loudness; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_GET_AGC_LOUDNESS, &loudness); - if ( loudness > AAGC_HOT || loudness < AAGC_COLD ) - { - const float level = iaxc_input_level_get(); + new_mixer_level -= 0.20f; + aagc_periods_to_skip = 8; + } + else if ( loudness > 25 ) + { + new_mixer_level -= 0.15f; + aagc_periods_to_skip = 4; + } + else if ( loudness > 15 ) + { + new_mixer_level -= 0.10f; + aagc_periods_to_skip = 2; + } + else if ( loudness > 12 ) + { + new_mixer_level -= 0.05f; + aagc_periods_to_skip = 4; + } + else if ( loudness < 2 ) + { + new_mixer_level += 0.15f; + aagc_periods_to_skip = 4; + } + else if ( loudness < 4 ) + { + new_mixer_level += 0.10f; + aagc_periods_to_skip = 4; + } + else + { + aagc_periods_to_skip = 0; + } - if ( loudness > AAGC_VERY_HOT && level > 0.5f ) - { - /* lower quickly if we're really too hot */ - iaxc_input_level_set(level - AAGC_DROP_FAST); - } - else if ( loudness > AAGC_HOT && level >= 0.15f ) - { - /* lower less quickly if we're a bit too hot */ - iaxc_input_level_set(level - AAGC_DROP_SLOW); - } - else if ( loudness < AAGC_COLD && level <= 0.9f ) - { - /* raise slowly if we're cold */ - iaxc_input_level_set(level + AAGC_RISE_SLOW); - } - } - } + /* Normalize the proposed new mixer level */ + if ( new_mixer_level < 0.05f ) + new_mixer_level = 0.05f; + else if ( new_mixer_level > 1.00f ) + new_mixer_level = 1.00f; + + if ( new_mixer_level != mixer_level ) + iaxc_input_level_set(new_mixer_level); } - /* This is ugly. Basically just don't get volume level if speex thought - * we were silent. Just set it to 0 in that case */ - if ( iaxci_silence_threshold > 0.0f && silent ) - input_level = 0.0f; - do_level_callback(); - volume = vol_to_db(input_level); - - if ( volume < lowest_volume ) - lowest_volume = volume; - - if ( iaxci_silence_threshold > 0.0f ) - return silent; - else - return volume < iaxci_silence_threshold; + return using_vad ? !speaking : + vol_to_db(input_level) < iaxci_silence_threshold; } static int output_postprocess(const short * audio, int len) @@ -517,6 +556,36 @@ rb_ReadRingBuffer(&ecOutRing, delayedBuf, SAMPLES_PER_FRAME * 2); + /* TODO: speex_echo_cancellation() and speex_preprocess_run() operate + * on the same state and thus must be serialized. Because the audio + * lock is not held, this call has the potential to mess-up the + * preprocessor (which is serialized by the audio lock). I believe the + * net effect of this problem is to break residual echo cancellation + * when these calls overlap. Unfortunately, just serializing this + * speex_echo_cancellation() call with the audio lock may not be + * sufficient since the next call to speex_preprocess_run() is counting + * on operating on this cancelledBuffer -- since we buffer the input + * audio (cancelledBuffer), we are actually explicitly decoupling the + * calls to speex_echo_cancellation() and speex_preprocess_run(). Oops. + * + * In other words, it should go like this: + * + * speex_echo_cancellation(A) + * speex_preprocess_run(A) + * speex_echo_cancellation(B) + * speex_preprocess_run(B) + * speex_echo_cancellation(C) + * speex_preprocess_run(C) + * + * but it actually may be going like this: + * + * speex_echo_cancellation(A) + * speex_echo_cancellation(B) + * speex_preprocess_run(A) -- bad, residual echo from B is applied to A + * speex_echo_cancellation(C) + * speex_preprocess_run(B) -- bad, residual echo from C is applied to B + * speex_preprocess_run(C) + */ speex_echo_cancellation(ec, inputBuffer, delayedBuf, cancelledBuffer); memcpy(inputBuffer, cancelledBuffer, samples * sizeof(short)); Modified: branches/team/elbunce/iaxclient/lib/audio_portaudio.c =================================================================== --- branches/team/elbunce/iaxclient/lib/audio_portaudio.c 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/lib/audio_portaudio.c 2008-08-06 00:48:54 UTC (rev 1449) @@ -739,8 +739,6 @@ static int pa_start(struct iaxc_audio_driver *d) { - static int errcnt = 0; - if ( running ) return 0; @@ -757,29 +755,13 @@ oMixer = NULL; } - if ( errcnt > 5 ) - { - iaxci_usermsg(IAXC_TEXT_TYPE_FATALERROR, - "iaxclient audio: Can't open Audio Device. " - "Perhaps you do not have an input or output device?"); - /* OK, we'll give the application the option to abort or - * not here, but we will throw a fatal error anyway */ - iaxc_millisleep(1000); - //return -1; // Give Up. Too many errors. - } - /* flush the ringbuffers */ rb_InitializeRingBuffer(&inRing, INRBSZ, inRingBuf); rb_InitializeRingBuffer(&outRing, OUTRBSZ, outRingBuf); if ( pa_openstreams(d) ) - { - errcnt++; return -1; - } - errcnt = 0; // only count consecutive errors. - if ( Pa_StartStream(iStream) != paNoError ) return -1; Modified: branches/team/elbunce/iaxclient/lib/iaxclient_lib.c =================================================================== --- branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/lib/iaxclient_lib.c 2008-08-06 00:48:54 UTC (rev 1449) @@ -416,7 +416,7 @@ return count; } -EXPORT int iaxc_first_free_call() +EXPORT int iaxc_first_free_call(void) { int i; for ( i = 0; i < max_calls; i++ ) @@ -784,10 +784,13 @@ } } -#define LOOP_SLEEP 5 // In ms static THREADFUNCDECL(main_proc_thread_func) { + const int sleep_ms = 5; + const int counts_per_second = 1000 / sleep_ms; static int refresh_registration_count = 0; + static int audio_error_count = 0; + static int audio_error_state = 0; THREADFUNCRET(ret); @@ -799,11 +802,31 @@ get_iaxc_lock(); service_network(); - if ( !test_mode ) - service_audio(); + if ( !test_mode && + (!audio_error_state || + audio_error_count++ % counts_per_second == 0) ) + { + /* There are cases when service audio fails such + * as when there is no audio devices present in + * the system. In these cases, only call + * service_audio() once per second until it + * succeeds. + */ + if ( (audio_error_state = service_audio()) ) + { + iaxci_usermsg(IAXC_NOTICE, + "failed to service audio"); + + if ( audio_error_count / counts_per_second == 5 ) + iaxci_usermsg(IAXC_TEXT_TYPE_FATALERROR, + "cannot open audio device" + " after several tries"); + } + } + // Check registration refresh once a second - if ( refresh_registration_count++ > 1000/LOOP_SLEEP ) + if ( refresh_registration_count++ > counts_per_second ) { iaxc_refresh_registrations(); refresh_registration_count = 0; @@ -811,7 +834,7 @@ put_iaxc_lock(); - iaxc_millisleep(LOOP_SLEEP); + iaxc_millisleep(sleep_ms); } /* Decrease priority */ @@ -868,7 +891,8 @@ int to_read; int cmin; - audio_driver.start(&audio_driver); + if ( audio_driver.start(&audio_driver) ) + return -1; /* check and report if pointers are not good here */ if ( !((unsigned int)call & 0xffffff00) ) @@ -966,7 +990,7 @@ } /* handle IAX URL events */ -void handle_url_event( struct iax_event *e, int callNo ) +static void handle_url_event( struct iax_event *e, int callNo ) { iaxc_event ev; @@ -1195,6 +1219,7 @@ iaxc_clear_call(callNo); break; case IAX_EVENT_ACCEPT: + calls[callNo].state |= IAXC_CALL_STATE_ACTIVE; calls[callNo].format = e->ies.format & IAXC_AUDIO_FORMAT_MASK; calls[callNo].vformat = e->ies.format & IAXC_VIDEO_FORMAT_MASK; #if USE_VIDEO @@ -1204,6 +1229,7 @@ "Failed video codec negotiation."); } #endif + iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS,"Call %d accepted", callNo); break; case IAX_EVENT_ANSWER: @@ -1373,7 +1399,7 @@ } else { // use selected call if not active, otherwise, get a new appearance - if ( calls[selected_call].state & IAXC_CALL_STATE_ACTIVE ) + if ( calls[selected_call].state & IAXC_CALL_STATE_ACTIVE ) { callNo = iaxc_first_free_call(); } else @@ -1427,7 +1453,7 @@ strncpy(calls[callNo].local , calls[callNo].callerid_name, IAXC_EVENT_BUFSIZ); strncpy(calls[callNo].local_context, "default", IAXC_EVENT_BUFSIZ); - calls[callNo].state = IAXC_CALL_STATE_ACTIVE | IAXC_CALL_STATE_OUTGOING; + calls[callNo].state = IAXC_CALL_STATE_OUTGOING; /* reset activity and ping "timers" */ iaxc_note_activity(callNo); @@ -1534,9 +1560,12 @@ EXPORT void iaxc_dump_call_number( int callNo ) { - get_iaxc_lock(); - iaxc_dump_one_call(callNo); - put_iaxc_lock(); + if ( callNo >= 0 && callNo < max_calls ) + { + get_iaxc_lock(); + iaxc_dump_one_call(callNo); + put_iaxc_lock(); + } } EXPORT void iaxc_dump_call(void) Modified: branches/team/elbunce/iaxclient/lib/libiax2/src/frame.h =================================================================== --- branches/team/elbunce/iaxclient/lib/libiax2/src/frame.h 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/lib/libiax2/src/frame.h 2008-08-06 00:48:54 UTC (rev 1449) @@ -21,124 +21,70 @@ #endif /* Frame types */ -#define AST_FRAME_DTMF 1 /* A DTMF digit, subclass is the digit */ -#define AST_FRAME_VOICE 2 /* Voice data, subclass is AST_FORMAT_* */ -#define AST_FRAME_VIDEO 3 /* Video frame, maybe?? :) */ -#define AST_FRAME_CONTROL 4 /* A control frame, subclass is AST_CONTROL_* */ -#define AST_FRAME_NULL 5 /* An empty, useless frame */ -#define AST_FRAME_IAX 6 /* Inter Aterisk Exchange private frame type */ -#define AST_FRAME_TEXT 7 /* Text messages */ -#define AST_FRAME_IMAGE 8 /* Image Frames */ -#define AST_FRAME_HTML 9 /* HTML Frames */ -#define AST_FRAME_CNG 10 /* Comfort Noise frame (subclass is level of CNG in -dBov) */ +#define AST_FRAME_DTMF 1 /* A DTMF digit, subclass is the digit */ +#define AST_FRAME_VOICE 2 /* Voice data, subclass is AST_FORMAT_* */ +#define AST_FRAME_VIDEO 3 /* Video frame, maybe?? :) */ +#define AST_FRAME_CONTROL 4 /* A control frame, subclass is AST_CONTROL_* */ +#define AST_FRAME_NULL 5 /* An empty, useless frame */ +#define AST_FRAME_IAX 6 /* Inter Aterisk Exchange private frame type */ +#define AST_FRAME_TEXT 7 /* Text messages */ +#define AST_FRAME_IMAGE 8 /* Image Frames */ +#define AST_FRAME_HTML 9 /* HTML Frames */ +#define AST_FRAME_CNG 10 /* Comfort Noise frame (subclass is level of CNG in -dBov) */ /* HTML subclasses */ -#define AST_HTML_URL 1 /* Sending a URL */ -#define AST_HTML_DATA 2 /* Data frame */ -#define AST_HTML_BEGIN 4 /* Beginning frame */ -#define AST_HTML_END 8 /* End frame */ -#define AST_HTML_LDCOMPLETE 16 /* Load is complete */ -#define AST_HTML_NOSUPPORT 17 /* Peer is unable to support HTML */ -#define AST_HTML_LINKURL 18 /* Send URL and track */ -#define AST_HTML_UNLINK 19 /* Request no more linkage */ -#define AST_HTML_LINKREJECT 20 /* Reject LINKURL */ +#define AST_HTML_URL 1 /* Sending a URL */ +#define AST_HTML_DATA 2 /* Data frame */ +#define AST_HTML_BEGIN 4 /* Beginning frame */ +#define AST_HTML_END 8 /* End frame */ +#define AST_HTML_LDCOMPLETE 16 /* Load is complete */ +#define AST_HTML_NOSUPPORT 17 /* Peer is unable to support HTML */ +#define AST_HTML_LINKURL 18 /* Send URL and track */ +#define AST_HTML_UNLINK 19 /* Request no more linkage */ +#define AST_HTML_LINKREJECT 20 /* Reject LINKURL */ /* Data formats for capabilities and frames alike */ -/*! G.723.1 compression */ -#define AST_FORMAT_G723_1 (1 << 0) - /*! GSM compression */ -#define AST_FORMAT_GSM (1 << 1) - /*! Raw mu-law data (G.711) */ -#define AST_FORMAT_ULAW (1 << 2) - /*! Raw A-law data (G.711) */ -#define AST_FORMAT_ALAW (1 << 3) - /*! ADPCM (G.726, 32kbps) */ -#define AST_FORMAT_G726 (1 << 4) - /*! ADPCM (IMA) */ -#define AST_FORMAT_ADPCM (1 << 5) - /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ -#define AST_FORMAT_SLINEAR (1 << 6) - /*! LPC10, 180 samples/frame */ -#define AST_FORMAT_LPC10 (1 << 7) - /*! G.729A audio */ -#define AST_FORMAT_G729A (1 << 8) - /*! SpeeX Free Compression */ -#define AST_FORMAT_SPEEX (1 << 9) - /*! iLBC Free Compression */ -#define AST_FORMAT_ILBC (1 << 10) - /*! Maximum audio format */ -#define AST_FORMAT_MAX_AUDIO (1 << 15) - /*! JPEG Images */ -#define AST_FORMAT_JPEG (1 << 16) - /*! PNG Images */ -#define AST_FORMAT_PNG (1 << 17) - /*! H.261 Video */ -#define AST_FORMAT_H261 (1 << 18) - /*! H.263 Video */ -#define AST_FORMAT_H263 (1 << 19) - /*! H.263+ Video */ -#define AST_FORMAT_H263p (1 << 20) - /*! H.264 Video*/ -#define AST_FORMAT_H264 (1 << 21) - /*! MPEG4 Video*/ -#define AST_FORMAT_MPEG4 (1 << 22) - /*! Theora Video */ -#define AST_FORMAT_THEORA (1 << 24) - /*! Max one */ -#define AST_FORMAT_MAX_VIDEO (1 << 24) +#define AST_FORMAT_G723_1 (1 << 0) /*! G.723.1 compression */ +#define AST_FORMAT_GSM (1 << 1) /*! GSM compression */ +#define AST_FORMAT_ULAW (1 << 2) /*! Raw mu-law data (G.711) */ +#define AST_FORMAT_ALAW (1 << 3) /*! Raw A-law data (G.711) */ +#define AST_FORMAT_G726 (1 << 4) /*! ADPCM (G.726, 32kbps) */ +#define AST_FORMAT_ADPCM (1 << 5) /*! ADPCM (IMA) */ +#define AST_FORMAT_SLINEAR (1 << 6) /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ +#define AST_FORMAT_LPC10 (1 << 7) /*! LPC10, 180 samples/frame */ +#define AST_FORMAT_G729A (1 << 8) /*! G.729A audio */ +#define AST_FORMAT_SPEEX (1 << 9) /*! SpeeX Free Compression */ +#define AST_FORMAT_ILBC (1 << 10) /*! iLBC Free Compression */ +#define AST_FORMAT_MAX_AUDIO (1 << 15) /*! Maximum audio format */ +#define AST_FORMAT_JPEG (1 << 16) /*! JPEG Images */ +#define AST_FORMAT_PNG (1 << 17) /*! PNG Images */ +#define AST_FORMAT_H261 (1 << 18) /*! H.261 Video */ +#define AST_FORMAT_H263 (1 << 19) /*! H.263 Video */ +#define AST_FORMAT_H263p (1 << 20) /*! H.263+ Video */ +#define AST_FORMAT_H264 (1 << 21) /*! H.264 Video*/ +#define AST_FORMAT_MPEG4 (1 << 22) /*! MPEG4 Video*/ +#define AST_FORMAT_THEORA (1 << 24) /*! Theora Video */ +#define AST_FORMAT_MAX_VIDEO (1 << 24) /*! Maximum video format */ /* Control frame types */ -#define AST_CONTROL_HANGUP 1 /* Other end has hungup */ -#define AST_CONTROL_RING 2 /* Local ring */ -#define AST_CONTROL_RINGING 3 /* Remote end is ringing */ -#define AST_CONTROL_ANSWER 4 /* Remote end has answered */ -#define AST_CONTROL_BUSY 5 /* Remote end is busy */ -#define AST_CONTROL_TAKEOFFHOOK 6 /* Make it go off hook */ -#define AST_CONTROL_OFFHOOK 7 /* Line is off hook */ -#define AST_CONTROL_CONGESTION 8 /* Congestion (circuits busy) */ -#define AST_CONTROL_FLASH 9 /* Flash hook */ -#define AST_CONTROL_WINK 10 /* Wink */ -#define AST_CONTROL_OPTION 11 /* Set an option */ -#define AST_CONTROL_KEY 12 /* Key Radio */ -#define AST_CONTROL_UNKEY 13 /* Unkey Radio */ +#define AST_CONTROL_HANGUP 1 /* Other end has hungup */ +#define AST_CONTROL_RING 2 /* Local ring */ +#define AST_CONTROL_RINGING 3 /* Remote end is ringing */ +#define AST_CONTROL_ANSWER 4 /* Remote end has answered */ +#define AST_CONTROL_BUSY 5 /* Remote end is busy */ +#define AST_CONTROL_TAKEOFFHOOK 6 /* Make it go off hook */ +#define AST_CONTROL_OFFHOOK 7 /* Line is off hook */ +#define AST_CONTROL_CONGESTION 8 /* Congestion (circuits busy) */ +#define AST_CONTROL_FLASH 9 /* Flash hook */ +#define AST_CONTROL_WINK 10 /* Wink */ +#define AST_CONTROL_OPTION 11 /* Set an option */ +#define AST_CONTROL_KEY 12 /* Key Radio */ +#define AST_CONTROL_UNKEY 13 /* Unkey Radio */ -#define AST_FRIENDLY_OFFSET 64 /* Reserved header space */ +#define AST_FRIENDLY_OFFSET 64 /* Reserved header space */ -struct ast_frame { - /*! Kind of frame */ - int frametype; - /*! Subclass, frame dependent */ - int subclass; - /*! Length of data */ - int datalen; - /*! Number of 8khz samples in this frame */ - int samples; - /*! Was the data malloc'd? i.e. should we free it when we discard the f -rame? */ - int mallocd; - /*! How far into "data" the data really starts */ - int offset; - /*! Optional source of frame for debugging */ - char *src; - /*! Pointer to actual data */ - void *data; - /*! Next/Prev for linking stand alone frames */ - struct ast_frame *prev; - /*! Next/Prev for linking stand alone frames */ - struct ast_frame *next; - /* Unused except - if debugging is turned on, but left - in the struct - so that it can be turned on without - requiring a r -ecompile of the whole thing */ -}; - - - #if defined(__cplusplus) || defined(c_plusplus) } #endif - #endif Modified: branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c =================================================================== --- branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c 2008-07-02 22:49:16 UTC (rev 1448) +++ branches/team/elbunce/iaxclient/lib/libiax2/src/iax.c 2008-08-06 00:48:54 UTC (rev 1449) @@ -364,6 +364,44 @@ static struct iax_session *sessions = NULL; static int callnums = 1; +static inline struct timeval iax_tvadd_ms(struct timeval tv, int ms) +{ + const int million = 1000000; + tv.tv_sec += ms / 1000; + ms %= 1000; + tv.tv_usec += ms * 1000; + if ( tv.tv_usec > million ) + { + tv.tv_sec += 1; + tv.tv_usec -= million; + } + return tv; +} + +static inline int iax_tvdiff_ms(struct timeval end, struct timeval start) +{ + return ((end.tv_sec - start.tv_sec) * 1000) + + (((1000000 + end.tv_usec - start.tv_usec) / 1000) - 1000); +} + +static inline int iax_tvcmp(struct timeval a, struct timeval b) +{ + if ( a.tv_sec < b.tv_sec ) + return -1; + if ( a.tv_sec > b.tv_sec ) + return 1; + if ( a.tv_usec < b.tv_usec ) + return -1; + if ( a.tv_usec > b.tv_usec ) + return 1; + return 0; +} + +static inline int iax_tvzero(const struct timeval t) +{ + return t.tv_sec == 0 && t.tv_usec == 0; +} + unsigned int iax_session_get_capability(struct iax_session *s) { return s->capability; @@ -376,65 +414,56 @@ static int iax_sched_add(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, int ms) { + /* Schedule event to be delivered to the client in ms milliseconds from + * now, or a reliable frame to be retransmitted */ + struct iax_sched *sched; + struct iax_sched *cur = schedq; + struct iax_sched *prev = NULL; - /* Schedule event to be delivered to the client - in ms milliseconds from now, or a reliable frame to be retransmitted */ - struct iax_sched *sched, *cur, *prev = NULL; - if (!event && !frame && !func) { DEBU(G "No event, no frame, no func? what are we scheduling?\n"); return -1; } - //fprintf(stderr, "scheduling event %d ms from now\n", ms); - sched = (struct iax_sched*)malloc(sizeof(struct iax_sched)); - if (sched) { - memset(sched, 0, sizeof(struct iax_sched)); - sched->when = iax_tvnow(); - sched->when.tv_sec += (ms / 1000); - ms = ms % 1000; - sched->when.tv_usec += (ms * 1000); - if (sched->when.tv_usec > 1000000) { - sched->when.tv_usec -= 1000000; - sched->when.tv_sec++; - } - sched->event = event; - sched->frame = frame; - sched->func = func; - sched->arg = arg; - /* Put it in the list, in order */ - cur = schedq; - while(cur && ((cur->when.tv_sec < sched->when.tv_sec) || - ((cur->when.tv_usec <= sched->when.tv_usec) && - (cur->when.tv_sec == sched->when.tv_sec)))) { - prev = cur; - cur = cur->next; - } - sched->next = cur; - if (prev) { - prev->next = sched; - } else { - schedq = sched; - } - return 0; - } else { + sched = calloc(1, sizeof(struct iax_sched)); + if (!sched) { DEBU(G "Out of memory!\n"); return -1; } + + sched->when = iax_tvadd_ms(iax_tvnow(), ms); + sched->event = event; + sched->frame = frame; + sched->func = func; + sched->arg = arg; + + /* Put it in the list, in order */ + while (cur && iax_tvcmp(cur->when, sched->when) <= 0) { + prev = cur; + cur = cur->next; + } + sched->next = cur; + if (prev) { + prev->next = sched; + } else { + schedq = sched; + } + + return 0; } static int iax_sched_del(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, int all) { - struct iax_sched *cur, *tmp, *prev = NULL; + struct iax_sched *cur = schedq; + struct iax_sched *prev = NULL; - cur = schedq; while (cur) { if (cur->event == event && cur->frame == frame && cur->func == func && cur->arg == arg) { + struct iax_sched *tmp = cur; if (prev) prev->next = cur->next; else schedq = cur->next; - tmp = cur; cur = cur->next; free(tmp); if (!all) @@ -447,27 +476,25 @@ return 0; } - int iax_time_to_next_event(void) { - struct timeval tv; + struct timeval now; struct iax_sched *cur = schedq; - int ms, min = 999999999; + int min = 999999999; /* If there are no pending events, we don't need to timeout */ if (!cur) return -1; - tv = iax_tvnow(); + + now = iax_tvnow(); + while(cur) { - ms = (cur->when.tv_sec - tv.tv_sec) * 1000 + - (cur->when.tv_usec - tv.tv_usec) / 1000; + int ms = iax_tvdiff_ms(cur->when, now); if (ms < min) min = ms; cur = cur->next; } - if (min < 0) - min = 0; - return min; + return min < 0 ? 0 : min; } struct iax_session *iax_session_new(void) @@ -542,7 +569,8 @@ local->jitter = stats.jitter; /* XXX: should be short-term loss pct.. */ - if(stats.frames_in == 0) stats.frames_in = 1; + if(stats.frames_in == 0) + stats.frames_in = 1; local->losspct = stats.losspct/1000; local->losscnt = stats.frames_lost; local->packets = stats.frames_in; @@ -553,74 +581,29 @@ return 0; } -#ifdef USE_VOICE_TS_PREDICTION -static void add_ms(struct timeval *tv, int ms) +static int calc_timestamp(struct iax_session *session, int frametype, int samples) { - tv->tv_usec += ms * 1000; - if (tv->tv_usec > 999999) { - tv->tv_sec += tv->tv_usec / 1000000; - tv->tv_usec %= 1000000; - } - - if (tv->tv_usec < 0) { - tv->tv_sec += (tv->tv_usec / 1000000 - 1); - tv->tv_usec = (tv->tv_usec % 1000000) + 1000000; - } -} -#endif - -static int calc_timestamp(struct iax_session *session, unsigned int ts, struct ast_frame *f) -{ - int ms; - struct timeval tv; - int voice = 0; - int video = 0; - int genuine = 0; - - if ( f && f->frametype == AST_FRAME_VOICE ) - { - voice = 1; - } else if ( f && f->frametype == AST_FRAME_VIDEO ) - { - video = 1; - } else if (!f || f->frametype == AST_FRAME_IAX) - { - genuine = 1; - } - - /* If this is the first packet we're sending, get our - offset now. */ - if (!session->offset.tv_sec && !session->offset.tv_usec) - session->offset = iax_tvnow(); - - /* If the timestamp is specified, just use their specified - timestamp no matter what. Usually this is done for - special cases. */ - if (ts) - { - if ( f && session ) - session->lastsent = ts; - return ts; - } - - /* Otherwise calculate the timestamp from the current time */ - tv = iax_tvnow(); - /* Calculate the number of milliseconds since we sent the first packet */ - ms = (tv.tv_sec - session->offset.tv_sec) * 1000 + - (tv.tv_usec - session->offset.tv_usec) / 1000; + int ms = iax_tvdiff_ms(iax_tvnow(), session->offset); + int genuine = !frametype || frametype == AST_FRAME_IAX; + int voice = frametype == AST_FRAME_VOICE; + int video = frametype == AST_FRAME_VIDEO; - if (ms < 0) + if (ms < 0) { + fprintf(stderr, "iax2: calc_timestamp: negative time delta " + "ms => %d\n", ms); ms = 0; + } - if(voice) { + if (voice) { #ifdef USE_VOICE_TS_PREDICTION /* If we haven't most recently sent silence, and we're * close in time, use predicted time */ if(session->notsilenttx && abs(ms - session->nextpred) <= 240) { /* Adjust our txcore, keeping voice and non-voice * synchronized */ - add_ms(&session->offset, (int)(ms - session->nextpred)/10); + session->offset = iax_tvadd_ms(session->offset, + (int)(ms - session->nextpred) / 10); if(!session->nextpred) session->nextpred = ms; @@ -632,30 +615,34 @@ * time. Also, round ms to the next multiple of * frame size (so our silent periods are multiples * of frame size too) */ - int diff = ms % (f->samples / 8); + int diff = ms % (samples / 8); if(diff) - ms += f->samples/8 - diff; + ms += samples / 8 - diff; session->nextpred = ms; } session->notsilenttx = 1; + + /* set next predicted ts based on 8khz samples */ + session->nextpred += samples / 8; #else if(ms <= session->lastsent) ms = session->lastsent + 3; #endif } else if ( video ) { - /* - * IAX2 draft 03 says that timestamps MUST be in order. - * It does not say anything about several frames having the same timestamp - * When transporting video, we can have a frame that spans multiple iax packets - * (so called slices), so it would make sense to use the same timestamp for all of - * them - * We do want to make sure that frames don't go backwards though + /* IAX2 draft 03 says that timestamps MUST be in order. It + * does not say anything about several frames having the same + * timestamp. When transporting video, we can have a frame + * that spans multiple iax packets (so called slices), so it + * would make sense to use the same timestamp for all of them. + * We do want to make sure that frames don't go backwards + * though. */ if ( (unsigned int)ms < session->lastsent ) ms = session->lastsent; } else { - /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) - if appropriate unless it's a genuine frame */ + /* On a dataframe, use last value + 3 (to accomodate jitter + * buffer shrinking) if appropriate unless it's a genuine frame + */ if (genuine) { if ((unsigned int)ms <= session->lastsent) ms = session->lastsent + 3; @@ -665,21 +652,10 @@ } - /* Record the last sent packet for future reference */ - /* unless an AST_FRAME_IAX */ - if (!genuine) - session->lastsent = ms; - -#ifdef USE_VOICE_TS_PREDICTION - /* set next predicted ts based on 8khz samples */ - if(voice) - session->nextpred += f->samples / 8; -#endif - return ms; } -static unsigned char get_n_bits_at(unsigned char *data, int n, int bit) +static unsigned char get_n_bits_at(const unsigned char *data, const int n, const int bit) { int byte = bit / 8; /* byte containing first bit */ int rem = 8 - (bit % 8); /* remaining bits in first byte */ @@ -698,101 +674,106 @@ return (ret & (0xff >> (8 - n))); } -static int speex_get_wb_sz_at(unsigned char *data, int len, int bit) +static int speex_get_wb_sz_at(const unsigned char *data, const int len, const int bit) { - static int SpeexWBSubModeSz[] = { - 0, 36, 112, 192, - 352, 0, 0, 0 }; + static const int wb_skip_table[] = { + 0, 36, 112, 192, 352, 0, 0, 0 + }; + const int bit_len = len * 8; int off = bit; - unsigned char c; + int wideband; + if (bit_len - off < 5) + return -5; + + wideband = get_n_bits_at(data, 1, off); + /* skip up to two wideband frames */ - if (((len * 8 - off) >= 5) && - get_n_bits_at(data, 1, off)) { - c = get_n_bits_at(data, 3, off + 1); - off += SpeexWBSubModeSz[c]; + if (wideband) + { + int submode = get_n_bits_at(data, 3, off + 1); + off += wb_skip_table[submode]; - if (((len * 8 - off) >= 5) && - get_n_bits_at(data, 1, off)) { - c = get_n_bits_at(data, 3, off + 1); - off += SpeexWBSubModeSz[c]; + if (bit_len - off < 5) + return -6; - if (((len * 8 - off) >= 5) && - get_n_bits_at(data, 1, off)) { + wideband = get_n_bits_at(data, 1, off); + + if (wideband) + { + submode = get_n_bits_at(data, 3, off + 1); + off += wb_skip_table[submode]; + + if (bit_len - off < 5) + return -7; + + wideband = get_n_bits_at(data, 1, off); + if (wideband) /* too many in a row */ - DEBU(G "\tCORRUPT too many wideband streams in a row\n"); - return -1; - } + return -8; } } return off - bit; } -static int speex_get_samples(unsigned char *data, int len) +static int speex_get_samples(const unsigned char *data, const int len) { - static int SpeexSubModeSz[] = { + static const int SpeexSubModeSz[] = { 0, 43, 119, 160, 220, 300, 364, 492, 79, 0, 0, 0, 0, 0, 0, 0 }; - static int SpeexInBandSz[] = { + static const int SpeexInBandSz[] = { 1, 1, 4, 4, 4, 4, 4, 4, 8, 8, 16, 16, 32, 32, 64, 64 }; + const int bit_len = len * 8; int bit = 0; int cnt = 0; - int off = 0; - unsigned char c; - DEBU(G "speex_get_samples(%d)\n", len); - while ((len * 8 - bit) >= 5) { + while (bit_len - bit >= 5) { + unsigned char c; + /* skip wideband frames */ - off = speex_get_wb_sz_at(data, len, bit); - if (off < 0) { - DEBU(G "\tERROR reading wideband frames\n"); - break; - } - bit += off; + const int advance = speex_get_wb_sz_at(data, len, bit); + if (advance < 0) + return advance; - if ((len * 8 - bit) < 5) { - DEBU(G "\tERROR not enough bits left after wb\n"); - break; - } + bit += advance; + if (bit_len - bit < 5) + return -1; + /* get control bits */ c = get_n_bits_at(data, 5, bit); - DEBU(G "\tCONTROL: %d at %d\n", c, bit); bit += 5; if (c == 15) { - DEBU(G "\tTERMINATOR\n"); + /* terminator */ break; } else if (c == 14) { /* in-band signal; next 4 bits contain signal id */ + if (bit_len - bit < 4) + return -3; c = get_n_bits_at(data, 4, bit); - bit += 4; - DEBU(G "\tIN-BAND %d bits\n", SpeexInBandSz[c]); - bit += SpeexInBandSz[c]; + bit += 4 + SpeexInBandSz[c]; } else if (c == 13) { /* user in-band; next 5 bits contain msg len */ + if (bit_len - bit < 5) + return -4; c = get_n_bits_at(data, 5, bit); - bit += 5; - DEBU(G "\tUSER-BAND %d bytes\n", c); - bit += c * 8; + bit += 5 + c * 8; } else if (c > 8) { - DEBU(G "\tUNKNOWN sub-mode %d\n", c); - break; + /* unknown submode */ + return -2; } else { /* skip number bits for submode (less the 5 control bits) */ - DEBU(G "\tSUBMODE %d %d bits\n", c, SpeexSubModeSz[c]); bit += SpeexSubModeSz[c] - 5; - cnt += 160; /* new frame */ } } - DEBU(G "\tSAMPLES: %d\n", cnt); return cnt; } @@ -853,17 +834,17 @@ int res; #ifdef DEBUG_SUPPORT if (debug) { - struct ast_iax2_full_hdr *h = (struct ast_iax2_full_hdr *)(f->data); + struct ast_iax2_full_hdr *h = (struct ast_iax2_full_hdr *)(f->rawdata); if (ntohs(h->scallno) & IAX_FLAG_FULL) iax_showframe(f, NULL, 0, f->transfer ? &(f->session->transfer) : &(f->session->peeraddr), - f->datalen - sizeof(struct ast_iax2_full_hdr)); + f->rawdatalen - sizeof(struct ast_iax2_full_hdr)); } #endif /* Send the frame raw */ - res = f->session->sendto(netfd, (const char *) f->data, f->datalen, + res = f->session->sendto(netfd, f->rawdata, f->rawdatalen, IAX_SOCKOPTS, f->transfer ? (struct sockaddr *)&(f->session->transfer) : (struct sockaddr *)&(f->session->peeraddr), @@ -873,34 +854,13 @@ static int iax_reliable_xmit(struct iax_frame *f) { - struct iax_frame *fc; - struct ast_iax2_full_hdr *fh; - fh = (struct ast_iax2_full_hdr *) f->data; - if (!fh->type) { + struct ast_iax2_full_hdr *fh = f->rawdata; + + if (!fh->type) return -2; - } - fc = (struct iax_frame *)malloc(sizeof(struct iax_frame)); - if (fc) { - /* Make a copy of the frame */ - memcpy(fc, f, sizeof(struct iax_frame)); - /* And a copy of the data if applicable */ - if (!fc->data || !fc->datalen) { - IAXERROR "No frame data?"); - DEBU(G "No frame data?\n"); - return -1; - } else { - fc->data = (char *)malloc(fc->datalen); - if (!fc->data) { - DEBU(G "Out of memory\n"); - IAXERROR "Out of memory\n"); - return -1; - } - memcpy(fc->data, f->data, f->datalen); - iax_sched_add(NULL, fc, NULL, NULL, fc->retrytime); - return iax_xmit_frame(fc); - } - } else - return -1; + + iax_sched_add(NULL, f, NULL, NULL, f->retrytime); + return iax_xmit_frame(f); } void iax_set_networking(iax_sendto_t st, iax_recvfrom_t rf) @@ -1065,22 +1025,25 @@ return power | IAX_FLAG_SC_LOG; } -static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final, int fullframe) +static int iax_send(struct iax_session *pvt, + int frametype, + int subclass, + const unsigned char *data, + const size_t datalen, + unsigned int ts, + int seqno, + int immediate, + int transfer, + int final, + int fullframe, + int samples) { - /* Queue a packet for delivery on a given private structure. Use "ts" for - timestamp, or calculate if ts is 0. Send immediately without retransmission - or delayed, with retransmission */ - struct ast_iax2_full_hdr *fh; - struct ast_iax2_mini_hdr *mh; - struct ast_iax2_video_hdr *vh; - //unsigned char buf[5120]; //fd: changed max packet size[5120]; - unsigned char buf[32 * 1024]; //Mihai: let's see if this is where it crashes - + /* Queue a packet for delivery on a given private structure. Use "ts" + * for timestamp, or calculate if ts is 0. Send immediately without + * retransmission or delayed, with retransmission */ + char buf[8192]; struct iax_frame *fr; - int res; - int sendmini=0; - unsigned int lastsent; - unsigned int fts; + int sendmini = 0; if (!pvt) { @@ -1088,115 +1051,116 @@ return -1; } - /* this must come before the next call to calc_timestamp() since - calc_timestamp() will change lastsent to the returned value */ - lastsent = pvt->lastsent; + /* If this is the first packet we're sending, get our offset now. */ + if (iax_tvzero(pvt->offset)) + pvt->offset = iax_tvnow(); - /* Calculate actual timestamp */ - fts = calc_timestamp(pvt, ts, f); - - if (((fts & 0xFFFF0000L) == (lastsent & 0xFFFF0000L)) - /* High two bits are the same on timestamp, or sending on a trunk */ && - (f->frametype == AST_FRAME_VOICE) - /* is a voice frame */ && - (f->subclass == pvt->svoiceformat) - /* is the same type */ ) + if (!ts) { - /* Force immediate rather than delayed transmission */ - now = 1; - /* Mark that mini-style frame is appropriate */ - sendmini = 1; + /* Calculate actual timestamp */ + ts = calc_timestamp(pvt, frametype, samples); + + if (!ts) + { + IAXERROR "timestamp is 0?\n"); + return -1; + } } - /* Bitmask taken from chan_iax2.c... I must ask Mark Spencer for this? I think not... */ - if ( f->frametype == AST_FRAME_VIDEO ) + if ( frametype == AST_FRAME_VOICE ) { - /* Check if the timestamp has rolled over or if the video codec has changed */ - if ( ((fts & 0xFFFF8000L) == (pvt->lastvsent & 0xFFFF8000L)) && - (f->subclass == pvt->svideoformat) - ) + /* High two bits are the same on timestamp, or sending on a trunk */ + if ((ts & 0xFFFF0000L) == (pvt->lastsent & 0xFFFF0000L) && + subclass == pvt->svoiceformat) { + /* Force immediate rather than delayed transmission */ + immediate = 1; + /* Mark that mini-style frame is appropriate */ + sendmini = 1; + } + + pvt->lastsent = ts; + } + else if ( frametype == AST_FRAME_VIDEO ) + { + /* Check if the timestamp has rolled over or if the video codec + * has changed */ + if ( (ts & 0xFFFF8000L) == (pvt->lastvsent & 0xFFFF8000L) && + subclass == pvt->svideoformat ) + { /* send a mini video frame immediately */ - now = 1; + immediate = 1; sendmini = 1; - } else + } + else { - /* we want to send a fullframe and be able to retransmit it */ - now = 0; + /* we want to send a fullframe and be able to + * retransmit it */ + immediate = 0; sendmini = 0; } - pvt->lastvsent = fts; + + pvt->lastvsent = ts; + pvt->lastsent = ts; } /* if requested, force a full frame */ if ( fullframe ) { - now = 0; + immediate = 0; sendmini = 0; } - + /* Allocate an iax_frame */ - if (now) + if (immediate) { + if ( sizeof(*fr) + datalen > sizeof(buf) ) + { + IAXERROR "frame buffer too small"); + return -1; + } fr = (struct iax_frame *) buf; - } else + } + else { - fr = iax_frame_new(DIRECTION_OUTGRESS, f->datalen); + fr = iax_frame_new(datalen); if ( fr == NULL ) { IAXERROR "Out of memory\n"); return -1; } } - - /* Copy our prospective frame into our immediate or retransmitted wrapper */ - iax_frame_wrap(fr, f); - fr->ts = fts; - if (!fr->ts) - { - IAXERROR "timestamp is 0?\n"); - if (!now) - iax_frame_free(fr); - return -1; - } - + fr->ts = ts; fr->callno = pvt->callno; fr->transfer = transfer; fr->final = final; fr->session = pvt; + if (!sendmini) { /* We need a full frame */ - if (seqno > -1) - fr->oseqno = seqno; - else - fr->oseqno = pvt->oseqno++; + struct ast_iax2_full_hdr *fh; + + iax_frame_specialize(fr, ast_iax2_full_hdr, data, datalen); + + fh = fr->rawdata; + + fr->oseqno = seqno > -1 ? seqno : pvt->oseqno++; fr->iseqno = pvt->iseqno; - fh = (struct ast_iax2_full_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_full_hdr)); fh->scallno = htons(fr->callno | IAX_FLAG_FULL); fh->ts = htonl(fr->ts); fh->oseqno = fr->oseqno; - if (transfer) - { - fh->iseqno = 0; - } else - fh->iseqno = fr->iseqno; - /* Keep track of the last thing we've acknowledged */ + fh->iseqno = transfer ? 0 : fr->iseqno; + /* Keep track of the last thing we've acknowledged */ pvt->aseqno = fr->iseqno; - fh->type = fr->af.frametype & 0xFF; - if (f->frametype == AST_FRAME_VIDEO) - fh->csub = compress_subclass(fr->af.subclass & ~0x1) | ((fr->af.subclass & 0x1) << 6); + fh->type = frametype & 0xFF; + if (frametype == AST_FRAME_VIDEO) + fh->csub = compress_subclass(subclass & ~0x1) | ((subclass & 0x1) << 6); else - fh->csub = compress_subclass(fr->af.subclass); - if (transfer) - { - fr->dcallno = pvt->transfercallno; - } else - fr->dcallno = pvt->peercallno; + fh->csub = compress_subclass(subclass); + fr->dcallno = transfer ? pvt->transfercallno : pvt->peercallno; fh->dcallno = htons(fr->dcallno); - fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_full_hdr); - fr->data = fh; fr->retries = maxretries; /* Retry after 2x the ping time has passed */ fr->retrytime = pvt->pingtime * 2; @@ -1205,54 +1169,47 @@ if (fr->retrytime > MAX_RETRY_TIME) fr->retrytime = MAX_RETRY_TIME; /* Acks' don't get retried */ - if ((f->frametype == AST_FRAME_IAX) && (f->subclass == IAX_COMMAND_ACK)) + if (frametype == AST_FRAME_IAX && subclass == IAX_COMMAND_ACK) fr->retries = -1; - if (f->frametype == AST_FRAME_VOICE) - { - pvt->svoiceformat = f->subclass; - } - else if (f->frametype == AST_FRAME_VIDEO) - { - pvt->svideoformat = f->subclass & ~0x1; - } - if (now) - { - res = iax_xmit_frame(fr); - } else - res = iax_reliable_xmit(fr); - } else + if (frametype == AST_FRAME_VOICE) + pvt->svoiceformat = subclass; + else if (frametype == AST_FRAME_VIDEO) + pvt->svideoformat = subclass & ~0x1; + } + else { - if (fr->af.frametype == AST_FRAME_VIDEO) + /* Mini-frames have no sequence number */ + fr->oseqno = -1; + fr->iseqno = -1; + fr->retries = -1; + + if (frametype == AST_FRAME_VIDEO) { - /* Video frame have no sequence number */ - fr->oseqno = -1; - fr->iseqno = -1; - vh = (struct ast_iax2_video_hdr *)(((char* )fr->af.data) - sizeof(struct ast_iax2_video_hdr)); + struct ast_iax2_video_hdr *vh; + + iax_frame_specialize(fr, ast_iax2_video_hdr, data, datalen); + + vh = fr->rawdata; vh->zeros = 0; vh->callno = htons(IAX_FLAG_FULL | fr->callno); - vh->ts = htons((fr->ts & 0x7FFF) | (fr->af.subclass & 0x1 ? 0x8000 : 0)); - fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_video_hdr); - fr->data = vh; - fr->retries = -1; - res = iax_xmit_frame(fr); - } else + vh->ts = htons((fr->ts & 0x7FFF) | (subclass & 0x1 ? 0x8000 : 0)); + } + else { - /* Mini-frames have no sequence number */ - fr->oseqno = -1; - fr->iseqno = -1; /* Mini frame will do */ - mh = (struct ast_iax2_mini_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_mini_hdr)); + struct ast_iax2_mini_hdr *mh; + + iax_frame_specialize(fr, ast_iax2_mini_hdr, data, datalen); + + mh = fr->rawdata; mh->callno = htons(fr->callno); mh->ts = htons(fr->ts & 0xFFFF); - fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_mini_hdr); - fr->data = mh; - fr->retries = -1; - res = iax_xmit_frame(fr); } } - if( !now && fr!=NULL ) - iax_frame_free( fr ); - return res; + + return immediate ? + iax_xmit_frame(fr) : + iax_reliable_xmit(fr); } #if 0 @@ -1281,61 +1238,78 @@ } #endif -static int __send_command(struct iax_session *i, char type, int command, - unsigned int ts, unsigned char *data, int datalen, int seqno, - int now, int transfer, int final, int fullframe, int samples) +static int send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen) { - struct ast_frame f; - f.frametype = type; - f.subclass = command; - f.datalen = datalen; - f.samples = samples; - f.mallocd = 0; - f.offset = 0; -#ifdef __GNUC__ - f.src = (char *) __FUNCTION__; -#else - f.src = (char *) __FILE__; -#endif - f.data = data; - return iax_send(i, &f, ts, seqno, now, transfer, final, fullframe); + return iax_send(i, type, command, data, datalen, ts, + -1, /* seqno */ + 0, /* immediate */ + 0, /* transfer */ + 0, /* final */ + 0, /* fullframe */ + 0 /* samples */ + ); } -static int send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) +static int send_command_video(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int fullframe) { - return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0, 0, 0); + return iax_send(i, type, command, data, datalen, ts, + -1, /* seqno */ + 1, /* immediate */ + 0, /* transfer */ + 0, /* final */ + fullframe, + 0); /* samples */ } -static int send_command_video(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, int fullframe) +static int send_command_final(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen) { - return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0, fullframe, 0); -} - -static int send_command_final(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) -{ #if 0 /* It is assumed that the callno has already been locked */ iax_predestroy(i); #endif - int r; - r = __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 1, 0, 0); - if (r >= 0) destroy_session(i); + int r = iax_send(i, type, command, data, datalen, ts, + -1, /* seqno */ + 1, /* immediate */ + 0, /* transfer */ + 1, /* final */ + 0, /* fullframe */ + 0); /* samples */ + if (r >= 0) + destroy_session(i); return r; } static int send_command_immediate(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno) { - return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0, 0, 0); + return iax_send(i, type, command, data, datalen, ts, seqno, + 1, /* immediate */ + 0, /* transfer */ + 0, /* final */ + 0, /* fullframe */ + 0); /* samples */ } -static int send_command_transfer(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen) +static int send_command_transfer(struct iax_session *i, char type, int command, unsigned char *data, int datalen) { - return __send_command(i, type, command, ts, data, datalen, 0, 0, 1, 0, 0, 0); + return iax_send(i, type, command, data, datalen, + 0, /* ts */ + 0, /* seqno */ + 0, /* immediate */ + 1, /* transfer */ + 0, /* final */ + 0, /* fullframe */ + 0); /* samples */ } -static int send_command_samples(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, int samples) +static int send_command_samples(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int samples) { - return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0, 0, samples); + return iax_send(i, type, command, data, datalen, ts, + -1, /* seqno */ + 0, /* immediate */ + 0, /* transfer */ + 0, /* final */ + 0, /* fullframe */ + samples); } @@ -1351,7 +1325,7 @@ iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, number); // Send The Transfer Command - Asterisk Will Handle The Rest! - res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos, -1); + res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos); // Return Success return 0; @@ -1363,11 +1337,11 @@ sch = schedq; while(sch) { - if (sch->frame && (sch->frame->session == session)) - sch->frame->retries = -1; + if (sch->frame && sch->frame->session == session) + sch->frame->retries = -1; sch = sch->next; } -} /* stop_transfer */ +} static void complete_transfer(struct iax_session *session, int peercallno, int xfr2peer, int preserveSeq) { @@ -1458,12 +1432,12 @@ } #endif - res = send_command(s0, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1); + res = send_command(s0, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos); if (res < 0) { return -1; } - res = send_command(s1, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1); + res = send_command(s1, AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos); if (res < 0) { return -1; } @@ -1480,7 +1454,7 @@ iax_ie_append_short(&ied, IAX_IE_CALLNO, new_peer); - res = send_command(s, AST_FRAME_IAX, IAX_COMMAND_TXREL, 0, ied.buf, ied.pos, -1); + res = send_command(s, AST_FRAME_IAX, IAX_COMMAND_TXREL, 0, ied.buf, ied.pos); complete_transfer(s, new_peer, 0, 1); @@ -1564,7 +1538,6 @@ { struct iax_session *cur, *prev=NULL; struct iax_sched *curs, *prevs=NULL, *nexts=NULL; - int loop_cnt=0; curs = schedq; while(curs) { nexts = curs->next; @@ -1583,7 +1556,6 @@ prevs = curs; } curs = nexts; - loop_cnt++; } cur = sessions; @@ -1673,14 +1645,14 @@ int iax_send_dtmf(struct iax_session *session, char digit) { - return send_command(session, AST_FRAME_DTMF, digit, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_DTMF, digit, 0, NULL, 0); } int iax_send_voice(struct iax_session *session, int format, unsigned char *data, int datalen, int samples) { /* Send a (possibly compressed) voice frame */ if (!session->quelch) - return send_command_samples(session, AST_FRAME_VOICE, format, 0, data, datalen, -1, samples); + return send_command_samples(session, AST_FRAME_VOICE, format, 0, data, datalen, samples); return 0; } @@ -1690,14 +1662,14 @@ #ifdef USE_VOICE_TS_PREDICTION session->notsilenttx = 0; #endif - return send_command(session, AST_FRAME_CNG, level, 0, data, datalen, -1); + return send_command(session, AST_FRAME_CNG, level, 0, data, datalen); } int iax_send_image(struct iax_session *session, int format, unsigned char *data, int datalen) { /* Send an image frame */ - return send_command(session, AST_FRAME_IMAGE, format, 0, data, datalen, -1); + return send_command(session, AST_FRAME_IMAGE, format, 0, data, datalen); } int iax_send_video(struct iax_session *session, int format, unsigned char *data, @@ -1706,7 +1678,7 @@ if (!session->quelch) { int res = send_command_video(session, AST_FRAME_VIDEO, format, - 0, data, datalen, -1, fullframe); + 0, data, datalen, fullframe); return res; } return 0; @@ -1718,12 +1690,12 @@ static int my_lastts = 0; if ( ntrunk == 0 ) - my_lastts = calc_timestamp(session, 0, NULL); + my_lastts = calc_timestamp(session, 0, 0); if ( !session->quelch ) { return send_command_video(session, AST_FRAME_VIDEO, format, - my_lastts, (unsigned char *)data, datalen, -1, + my_lastts, (unsigned char *)data, datalen, fullframe); } return 0; @@ -1774,7 +1746,7 @@ session->refresh = refresh; iax_ie_append_str(&ied, IAX_IE_USERNAME, peer); iax_ie_append_short(&ied, IAX_IE_REFRESH, refresh); - res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREQ, 0, ied.buf, ied.pos, -1); + res = send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREQ, 0, ied.buf, ied.pos); return res; } @@ -1818,7 +1790,7 @@ strncpy(session->username, peer, sizeof(session->username) - 1); iax_ie_append_str(&ied, IAX_IE_USERNAME, peer); iax_ie_append_str(&ied, IAX_IE_CAUSE, session->unregreason); - return send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREL, 0, ied.buf, ied.pos, -1); + return send_command(session, AST_FRAME_IAX, IAX_COMMAND_REGREL, 0, ied.buf, ied.pos); } int iax_reject(struct iax_session *session, char *reason) @@ -1826,7 +1798,7 @@ struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CAUSE, reason ? reason : "Unspecified"); - return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_REJECT, 0, ied.buf, ied.pos, -1); + return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_REJECT, 0, ied.buf, ied.pos); } int iax_hangup(struct iax_session *session, char *byemsg) @@ -1835,33 +1807,33 @@ iax_sched_del(NULL, NULL, send_ping, (void *) session, 1); memset(&ied, 0, sizeof(ied)); iax_ie_append_str(&ied, IAX_IE_CAUSE, byemsg ? byemsg : "Normal clearing"); - return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1); + return send_command_final(session, AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos); } int iax_sendurl(struct iax_session *session, char *url) { return send_command(session, AST_FRAME_HTML, AST_HTML_URL, 0, - (unsigned char *)url, (int)strlen(url), -1); + (unsigned char *)url, (int)strlen(url)); } int iax_ring_announce(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_RINGING, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_RINGING, 0, NULL, 0); } int iax_lag_request(struct iax_session *session) { - return send_command(session, AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0); } int iax_busy(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_BUSY, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_BUSY, 0, NULL, 0); } int iax_congestion(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_CONGESTION, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_CONGESTION, 0, NULL, 0); } @@ -1870,50 +1842,50 @@ struct iax_ie_data ied; memset(&ied, 0, sizeof(ied)); iax_ie_append_int(&ied, IAX_IE_FORMAT, format); - return send_command(session, AST_FRAME_IAX, IAX_COMMAND_ACCEPT, 0, ied.buf, ied.pos, -1); + return send_command(session, AST_FRAME_IAX, IAX_COMMAND_ACCEPT, 0, ied.buf, ied.pos); } int iax_answer(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0); } int iax_key_radio(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_KEY, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_KEY, 0, NULL, 0); } int iax_unkey_radio(struct iax_session *session) { - return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_UNKEY, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_CONTROL, AST_CONTROL_UNKEY, 0, NULL, 0); } int iax_load_complete(struct iax_session *session) { - return send_command(session, AST_FRAME_HTML, AST_HTML_LDCOMPLETE, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_HTML, AST_HTML_LDCOMPLETE, 0, NULL, 0); } int iax_send_url(struct iax_session *session, const char *url, int link) { return send_command(session, AST_FRAME_HTML, link ? AST_HTML_LINKURL : AST_HTML_URL, 0, - (unsigned char *)url, (int)strlen(url), -1); + (unsigned char *)url, (int)strlen(url)); } int iax_send_text(struct iax_session *session, const char *text) { return send_command(session, AST_FRAME_TEXT, 0, 0, - (unsigned char *)text, (int)strlen(text) + 1, -1); + (unsigned char *)text, (int)strlen(text) + 1); } int iax_send_unlink(struct iax_session *session) { - return send_command(session, AST_FRAME_HTML, AST_HTML_UNLINK, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_HTML, AST_HTML_UNLINK, 0, NULL, 0); } int iax_send_link_reject(struct iax_session *session) { - return send_command(session, AST_FRAME_HTML, AST_HTML_LINKREJECT, 0, NULL, 0, -1); + return send_command(session, AST_FRAME_HTML, AST_HTML_LINKREJECT, 0, NULL, 0); } static int iax_send_pong(struct iax_session *session, unsigned int ts) @@ -1937,13 +1909,13 @@ iax_ie_append_int(&ied,IAX_IE_RR_DROPPED, stats.frames_dropped); iax_ie_append_int(&ied,IAX_IE_RR_OOO, stats.frames_ooo); - return send_command(session, AST_FRAME_IAX, IAX_COMMAND_PONG, ts, ied.buf, ied.pos, -1); + return send_command(session, AST_FRAME_IAX, IAX_COMMAND_PONG, ts, ied.buf, ied.pos); } /* external API; deprecat... [truncated message content] |
From: <jpg...@us...> - 2008-07-02 22:49:07
|
Revision: 1448 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1448&view=rev Author: jpgrayson Date: 2008-07-02 15:49:16 -0700 (Wed, 02 Jul 2008) Log Message: ----------- Fix bug where on some linux systems, the user does not have permission to set the priority sufficiently high. Thanks to Jean-Denis for bug report and initial patch. Modified Paths: -------------- trunk/lib/unixfuncs.c Modified: trunk/lib/unixfuncs.c =================================================================== --- trunk/lib/unixfuncs.c 2008-07-02 22:42:26 UTC (rev 1447) +++ trunk/lib/unixfuncs.c 2008-07-02 22:49:16 UTC (rev 1448) @@ -217,20 +217,32 @@ { struct sched_param schp = { 0 }; struct sched_param schat = { 0 }; + int pri = b->priority + 4; /* Run at a priority level above main thread so we can still run if it * hangs. Rise more than 1 because of rumored off-by-one scheduler * bugs. */ - schp.sched_priority = b->priority + 4; - if( schp.sched_priority > b->max_priority ) - schp.sched_priority = b->max_priority; + if ( pri > b->max_priority ) + pri = b->max_priority; - if (pthread_setschedparam(pthread_self(), SCHEDULER_POLICY, &schp) != 0) + for ( ; pri > b->priority; pri-- ) { - ERR_RPT("WatchDogProc: cannot set watch dog priority!\n"); - goto killAudio; + schp.sched_priority = pri; + + if ( pthread_setschedparam(pthread_self(), SCHEDULER_POLICY, + &schp) ) + ERR_RPT("WatchDogProc: cannot set watch dog priority!" + " %d\n", pri); + else + break; } + /* If the watchdog thread cannot get a higher priority than the canary, + * the whole scheme falls apart. Bail. + */ + if ( pri <= b->priority ) + goto killAudio; + DBUG("prioboost: WatchDog priority set to level %d!\n", schp.sched_priority); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpg...@us...> - 2008-07-02 22:42:16
|
Revision: 1447 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1447&view=rev Author: jpgrayson Date: 2008-07-02 15:42:26 -0700 (Wed, 02 Jul 2008) Log Message: ----------- Fix memory leak where struct prioboost was never free()ed. Modified Paths: -------------- trunk/lib/unixfuncs.c Modified: trunk/lib/unixfuncs.c =================================================================== --- trunk/lib/unixfuncs.c 2008-07-02 22:41:06 UTC (rev 1446) +++ trunk/lib/unixfuncs.c 2008-07-02 22:42:26 UTC (rev 1447) @@ -400,6 +400,7 @@ pb = NULL; schp.sched_priority = 0; pthread_setschedparam(b->ThreadID, SCHED_OTHER, &schp); + free(b); } return result; @@ -408,7 +409,10 @@ int iaxci_prioboostend() { if ( pb ) + { StopWatchDog(pb); + free(pb); + } return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpg...@us...> - 2008-07-02 22:40:58
|
Revision: 1446 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1446&view=rev Author: jpgrayson Date: 2008-07-02 15:41:06 -0700 (Wed, 02 Jul 2008) Log Message: ----------- Whitespace changes. Modified Paths: -------------- trunk/lib/unixfuncs.c Modified: trunk/lib/unixfuncs.c =================================================================== --- trunk/lib/unixfuncs.c 2008-07-02 22:37:01 UTC (rev 1445) +++ trunk/lib/unixfuncs.c 2008-07-02 22:41:06 UTC (rev 1446) @@ -215,10 +215,12 @@ static int WatchDogProc(struct prioboost *b ) { - struct sched_param schp = { 0 }; + struct sched_param schp = { 0 }; + struct sched_param schat = { 0 }; - /* Run at a priority level above main thread so we can still run if it hangs. */ - /* Rise more than 1 because of rumored off-by-one scheduler bugs. */ + /* Run at a priority level above main thread so we can still run if it + * hangs. Rise more than 1 because of rumored off-by-one scheduler + * bugs. */ schp.sched_priority = b->priority + 4; if( schp.sched_priority > b->max_priority ) schp.sched_priority = b->max_priority; @@ -229,16 +231,16 @@ goto killAudio; } - DBUG("prioboost: WatchDog priority set to level %d!\n", schp.sched_priority); + DBUG("prioboost: WatchDog priority set to level %d!\n", + schp.sched_priority); /* Compare watchdog time with audio and canary thread times. */ /* Sleep for a while or until thread cancelled. */ - while( b->WatchDogRun ) + while ( b->WatchDogRun ) { + int delta; + struct timeval currentTime; - int delta; - struct timeval currentTime; - usleep( WATCHDOG_INTERVAL_USEC ); gettimeofday( ¤tTime, NULL ); @@ -266,19 +268,18 @@ return 0; lowerAudio: + if ( pthread_setschedparam(b->ThreadID, SCHED_OTHER, &schat) != 0 ) { - struct sched_param schat = { 0 }; - if( pthread_setschedparam(b->ThreadID, SCHED_OTHER, &schat) != 0) - { - ERR_RPT("WatchDogProc: failed to lower audio priority. errno = %d\n", errno ); - /* Fall through into killing audio thread. */ - } - else - { - ERR_RPT("WatchDogProc: lowered audio priority to prevent hogging of CPU.\n"); - goto cleanup; - } + ERR_RPT("WatchDogProc: failed to lower audio priority. " + "errno = %d\n", errno); + /* Fall through into killing audio thread. */ } + else + { + ERR_RPT("WatchDogProc: lowered audio priority to prevent " + "hogging of CPU.\n"); + goto cleanup; + } killAudio: ERR_RPT("WatchDogProc: killing hung audio thread!\n"); @@ -366,8 +367,8 @@ int iaxci_prioboostbegin() { - struct sched_param schp = { 0 }; - struct prioboost *b = calloc(sizeof(*b),1); + struct sched_param schp = { 0 }; + struct prioboost *b = calloc(1, sizeof(*b)); int result = 0; @@ -384,13 +385,18 @@ } else { - DBUG("prioboost: priority set to level %d!\n", schp.sched_priority); /* We are running at high priority so we should have a watchdog in case audio goes wild. */ + DBUG("prioboost: priority set to level %d!\n", schp.sched_priority); + /* We are running at high priority so we should have a watchdog + * in case audio goes wild. */ result = StartWatchDog( b ); } - if(result == 0) { + if (result == 0) + { pb = b; - } else { + } + else + { pb = NULL; schp.sched_priority = 0; pthread_setschedparam(b->ThreadID, SCHED_OTHER, &schp); @@ -401,7 +407,8 @@ int iaxci_prioboostend() { - if(pb) StopWatchDog(pb); + if ( pb ) + StopWatchDog(pb); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpg...@us...> - 2008-07-02 22:36:58
|
Revision: 1445 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1445&view=rev Author: jpgrayson Date: 2008-07-02 15:37:01 -0700 (Wed, 02 Jul 2008) Log Message: ----------- Cache min and max priority values in struct prioboost. Modified Paths: -------------- trunk/lib/unixfuncs.c Modified: trunk/lib/unixfuncs.c =================================================================== --- trunk/lib/unixfuncs.c 2008-07-02 22:34:14 UTC (rev 1444) +++ trunk/lib/unixfuncs.c 2008-07-02 22:37:01 UTC (rev 1445) @@ -177,6 +177,9 @@ struct prioboost { int priority; + int min_priority; + int max_priority; + pthread_t ThreadID; struct timeval CanaryTime; @@ -213,13 +216,12 @@ static int WatchDogProc(struct prioboost *b ) { struct sched_param schp = { 0 }; - int maxPri; /* Run at a priority level above main thread so we can still run if it hangs. */ /* Rise more than 1 because of rumored off-by-one scheduler bugs. */ schp.sched_priority = b->priority + 4; - maxPri = sched_get_priority_max(SCHEDULER_POLICY); - if( schp.sched_priority > maxPri ) schp.sched_priority = maxPri; + if( schp.sched_priority > b->max_priority ) + schp.sched_priority = b->max_priority; if (pthread_setschedparam(pthread_self(), SCHEDULER_POLICY, &schp) != 0) { @@ -369,8 +371,9 @@ int result = 0; - b->priority = (sched_get_priority_max(SCHEDULER_POLICY) - - sched_get_priority_min(SCHEDULER_POLICY)) / 2; + b->min_priority = sched_get_priority_min(SCHEDULER_POLICY); + b->max_priority = sched_get_priority_max(SCHEDULER_POLICY); + b->priority = (b->max_priority - b->min_priority) / 2; schp.sched_priority = b->priority; b->ThreadID = pthread_self(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpg...@us...> - 2008-07-02 22:34:07
|
Revision: 1444 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1444&view=rev Author: jpgrayson Date: 2008-07-02 15:34:14 -0700 (Wed, 02 Jul 2008) Log Message: ----------- Use more conventional "struct prioboost" instead of typedef. Modified Paths: -------------- trunk/lib/unixfuncs.c Modified: trunk/lib/unixfuncs.c =================================================================== --- trunk/lib/unixfuncs.c 2008-07-01 16:40:52 UTC (rev 1443) +++ trunk/lib/unixfuncs.c 2008-07-02 22:34:14 UTC (rev 1444) @@ -174,7 +174,8 @@ typedef void *(*pthread_function_t)(void *); -typedef struct { +struct prioboost +{ int priority; pthread_t ThreadID; @@ -187,11 +188,11 @@ pthread_t WatchDogThread; int IsWatchDogThreadValid; -} prioboost; +}; -static prioboost *pb; +static struct prioboost *pb; -static int CanaryProc( prioboost *b) +static int CanaryProc(struct prioboost *b) { int result = 0; struct sched_param schat = { 0 }; @@ -209,7 +210,7 @@ return result; } -static int WatchDogProc( prioboost *b ) +static int WatchDogProc(struct prioboost *b ) { struct sched_param schp = { 0 }; int maxPri; @@ -298,7 +299,7 @@ return 0; } -static void StopWatchDog( prioboost *b ) +static void StopWatchDog(struct prioboost *b) { /* Cancel WatchDog thread if there is one. */ if( b->IsWatchDogThreadValid ) @@ -322,7 +323,7 @@ } -static int StartWatchDog( prioboost *b) +static int StartWatchDog(struct prioboost *b) { int hres; int result = 0; @@ -364,7 +365,7 @@ int iaxci_prioboostbegin() { struct sched_param schp = { 0 }; - prioboost *b = calloc(sizeof(*b),1); + struct prioboost *b = calloc(sizeof(*b),1); int result = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpg...@us...> - 2008-07-01 16:40:43
|
Revision: 1443 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1443&view=rev Author: jpgrayson Date: 2008-07-01 09:40:52 -0700 (Tue, 01 Jul 2008) Log Message: ----------- Remove reference to no-longer-used EXTREME_DEBUG define. Modified Paths: -------------- trunk/contrib/tcl/Makefile.macosx Modified: trunk/contrib/tcl/Makefile.macosx =================================================================== --- trunk/contrib/tcl/Makefile.macosx 2008-07-01 16:39:02 UTC (rev 1442) +++ trunk/contrib/tcl/Makefile.macosx 2008-07-01 16:40:52 UTC (rev 1443) @@ -9,7 +9,6 @@ CFLAGS:= $(CFLAGS) -g -Wall -O2 # debug flags -# CFLAGS := $(CFLAGS) -DDEBUG_SUPPORT -DDEBUG_DEFAULT -DEXTREME_DEBUG -D_DEBUG # CFLAGS := $(CFLAGS) -DDEBUG_SUPPORT -DDEBUG_DEFAULT -D_DEBUG OBJS=\ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |