Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
ITADataSources
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Institute of Technical Acoustics (ITA)
ITADataSources
Commits
1e4b20ab
Commit
1e4b20ab
authored
Mar 28, 2017
by
Dipl.-Ing. Jonas Stienen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Progress, now also ASIO available for NetAudio test.
parent
44b290fe
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
118 additions
and
34 deletions
+118
-34
src/ITANetAudioStream.cpp
src/ITANetAudioStream.cpp
+2
-1
src/ITANetAudioStreamingClient.cpp
src/ITANetAudioStreamingClient.cpp
+3
-0
src/ITANetAudioStreamingServer.cpp
src/ITANetAudioStreamingServer.cpp
+3
-0
tests/NetAudio/ITANetAudioTest.cpp
tests/NetAudio/ITANetAudioTest.cpp
+75
-27
tests/NetAudio/NetAudioLog.m
tests/NetAudio/NetAudioLog.m
+35
-6
No files found.
src/ITANetAudioStream.cpp
View file @
1e4b20ab
...
...
@@ -256,7 +256,6 @@ int CITANetAudioStream::Transmit( const ITASampleFrame& sfNewSamples, int iNumSa
int
iCurrentReadCursor
=
m_iReadCursor
;
int
iCurrentWriteCursor
=
m_iWriteCursor
;
ITANetworkStreamLog
oLog
;
if
(
iCurrentWriteCursor
<
iCurrentReadCursor
)
iCurrentWriteCursor
+=
GetRingBufferSize
();
// Unwrap, because write cursor always ahead
...
...
@@ -296,6 +295,8 @@ int CITANetAudioStream::Transmit( const ITASampleFrame& sfNewSamples, int iNumSa
#endif
}
}
ITANetworkStreamLog
oLog
;
oLog
.
sBufferStatus
=
GetStreamingStatusString
(
m_iStreamingStatus
);
oLog
.
dWorldTimeStamp
=
ITAClock
::
getDefaultClock
(
)
->
getTime
(
);
oLog
.
uiBlockId
=
++
m_iAudioStreamingBlockID
;
...
...
src/ITANetAudioStreamingClient.cpp
View file @
1e4b20ab
...
...
@@ -7,6 +7,7 @@
#include <ITAClock.h>
#include <VistaInterProcComm/Connections/VistaConnectionIP.h>
#include <VistaInterProcComm/Concurrency/VistaPriority.h>
#include <VistaBase/VistaStreamUtils.h>
#include <VistaBase/VistaTimeUtils.h>
...
...
@@ -67,6 +68,8 @@ CITANetAudioStreamingClient::CITANetAudioStreamingClient( CITANetAudioStream* pP
m_pClientLogger
=
new
ITABufferedDataLoggerImplClient
();
SetClientLoggerBaseName
(
"ITANetAudioStreamingClient"
);
VistaThread
::
SetPriority
(
VistaPriority
::
VISTA_MID_PRIORITY
);
}
CITANetAudioStreamingClient
::~
CITANetAudioStreamingClient
()
...
...
src/ITANetAudioStreamingServer.cpp
View file @
1e4b20ab
...
...
@@ -15,6 +15,7 @@
#include <VistaInterProcComm/IPNet/VistaTCPSocket.h>
#include <VistaBase/VistaTimeUtils.h>
#include <VistaInterProcComm/IPNet/VistaIPAddress.h>
#include <VistaInterProcComm/Concurrency/VistaPriority.h>
#include <VistaBase/VistaStreamUtils.h>
#include <ITADataLog.h>
...
...
@@ -67,6 +68,8 @@ CITANetAudioStreamingServer::CITANetAudioStreamingServer()
iServerBlockId
=
0
;
m_iMaxSendBlocks
=
40
;
m_iEstimatedClientRingBufferFreeSamples
=
0
;
VistaThread
::
SetPriority
(
VistaPriority
::
VISTA_MID_PRIORITY
);
}
CITANetAudioStreamingServer
::~
CITANetAudioStreamingServer
()
...
...
tests/NetAudio/ITANetAudioTest.cpp
View file @
1e4b20ab
...
...
@@ -12,8 +12,11 @@
#include <ITAFileDataSource.h>
#include <ITAStreamProbe.h>
#include <ITAStreamPatchBay.h>
#include <ITAAsioInterface.h>
#include <VistaBase/VistaStreamUtils.h>
#include <VistaBase/VistaTimeUtils.h>
#include <VistaBase/VistaExceptionBase.h>
using
namespace
std
;
...
...
@@ -23,8 +26,11 @@ const static int g_iServerPort = 12480;
const
static
double
g_dSampleRate
=
44100
;
const
static
int
g_iBlockLength
=
512
;
const
static
int
g_iChannels
=
2
;
const
static
int
g_iTargetLatencySamples
=
g_iBlockLength
*
4
;
const
static
int
g_iRingerBufferCapacity
=
g_iBlockLength
*
8
;
const
static
int
g_iTargetLatencySamples
=
g_iBlockLength
*
3
;
const
static
int
g_iRingerBufferCapacity
=
g_iBlockLength
*
4
;
const
static
double
g_dDuration
=
10.0
f
;
const
static
bool
g_bUseASIO
=
true
;
const
static
string
g_sAudioInterface
=
"ASIO4ALL v2"
;
class
CServer
:
public
VistaThread
{
...
...
@@ -36,6 +42,7 @@ public:
pStreamingServer
->
SetServerLogBaseName
(
"ITANetAudioTest_Server"
);
pInputFile
=
new
ITAFileDatasource
(
sInputFilePath
,
g_iBlockLength
);
pInputFile
->
SetIsLooping
(
true
);
assert
(
pInputFile
->
GetNumberOfChannels
()
==
1
);
pMuliplier
=
new
ITAStreamMultiplier1N
(
pInputFile
,
g_iChannels
);
pInputStreamProbe
=
new
ITAStreamProbe
(
pMuliplier
,
"ITANetAudioTest.serverstream.wav"
);
...
...
@@ -66,8 +73,9 @@ private:
};
int
main
(
int
,
char
**
)
void
run_test
(
)
{
// Sample server (forked away into a thread)
CServer
*
pServer
=
new
CServer
(
g_sInputFilePath
);
...
...
@@ -80,51 +88,91 @@ int main( int, char** )
int
iOutputID
=
oPatchbay
.
AddOutput
(
2
);
int
N
=
int
(
oNetAudioStream
.
GetNumberOfChannels
()
);
for
(
int
i
=
0
;
i
<
N
;
i
++
)
for
(
int
i
=
0
;
i
<
N
;
i
++
)
oPatchbay
.
ConnectChannels
(
0
,
i
,
0
,
i
%
2
,
1
/
double
(
N
)
);
ITAStreamProbe
oProbe
(
oPatchbay
.
GetOutputDatasource
(
iOutputID
),
"ITANetAudioTest.netstream.wav"
);
ITAPortaudioInterface
ITAPA
(
g_dSampleRate
,
g_iBlockLength
);
ITAPA
.
Initialize
();
ITAPA
.
SetPlaybackDatasource
(
&
oProbe
);
ITAPA
.
Open
();
ITAPA
.
Start
();
vstr
::
out
()
<<
"[ NetAudioTestClient ] Waiting 1 second (net audio stream not connected and playing back zeros)"
<<
endl
;
ITAPA
.
Sleep
(
1.0
f
);
vstr
::
out
()
<<
"[ NetAudioTestClient ] Will now connect to net audio server '"
<<
g_sServerName
<<
"' on port "
<<
g_iServerPort
<<
endl
;
try
if
(
g_bUseASIO
)
{
if
(
!
oNetAudioStream
.
Connect
(
g_sServerName
,
g_iServerPort
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Could not connect to net audio server"
);
ITAsioInitializeLibrary
();
ITAsioInitializeDriver
(
g_sAudioInterface
);
long
lBuffersize
,
lDummy
;
ITAsioGetBufferSize
(
&
lDummy
,
&
lDummy
,
&
lBuffersize
,
&
lDummy
);
ITAsioSetSampleRate
(
(
ASIOSampleRate
)
g_dSampleRate
);
long
lNumInputChannels
,
lNumOutputChannels
;
ITAsioGetChannels
(
&
lNumInputChannels
,
&
lNumOutputChannels
);
ITAsioCreateBuffers
(
0
,
2
,
lBuffersize
);
ITAsioSetPlaybackDatasource
(
&
oProbe
);
ITAsioStart
();
}
catch
(
ITAException
e
)
else
{
vstr
::
warn
()
<<
"[ NetAudioTestClient ] Connection failed."
<<
endl
;
vstr
::
err
()
<<
e
<<
endl
;
return
255
;
ITAPA
.
Initialize
();
ITAPA
.
SetPlaybackDatasource
(
&
oProbe
);
ITAPA
.
Open
();
ITAPA
.
Start
();
}
vstr
::
out
()
<<
"[ NetAudioTestClient ] Waiting 1 second (net audio stream not connected and playing back zeros)"
<<
endl
;
VistaTimeUtils
::
Sleep
(
int
(
1.0
f
*
1.0e3
)
);
vstr
::
out
()
<<
"[ NetAudioTestClient ] Will now connect to net audio server '"
<<
g_sServerName
<<
"' on port "
<<
g_iServerPort
<<
endl
;
if
(
!
oNetAudioStream
.
Connect
(
g_sServerName
,
g_iServerPort
)
)
ITA_EXCEPT1
(
INVALID_PARAMETER
,
"Could not connect to net audio server"
);
vstr
::
out
()
<<
"[ NetAudioTestClient ] Connected."
<<
endl
;
// Playback
float
fSeconds
=
10.0
f
;
float
fSeconds
=
float
(
g_dDuration
)
;
vstr
::
out
()
<<
"[ NetAudioTestClient ] Playback started, waiting "
<<
fSeconds
<<
" seconds"
<<
endl
;
ITAPA
.
Sleep
(
fSeconds
);
// blocking
VistaTimeUtils
::
Sleep
(
int
(
fSeconds
*
1.0e3
)
);
// blocking
vstr
::
out
()
<<
"[ NetAudioTestClient ] Done."
<<
endl
;
oNetAudioStream
.
Disconnect
();
vstr
::
out
()
<<
"[ NetAudioTestClient ] Will now disconnect from net audio server '"
<<
g_sServerName
<<
"' and port "
<<
g_iServerPort
<<
endl
;
vstr
::
out
()
<<
"[ NetAudioTestClient ] Closing in 1 second (net audio stream not connected and playing back zeros)"
<<
endl
;
ITAPA
.
Sleep
(
1.0
f
);
VistaTimeUtils
::
Sleep
(
int
(
1.0
f
*
1.0e3
)
);
ITAPA
.
Stop
(
);
ITAPA
.
Close
(
);
ITAPA
.
Finalize
(
);
if
(
g_bUseASIO
)
{
ITAsioStop
();
ITAsioDisposeBuffers
();
ITAsioFinalizeDriver
();
ITAsioFinalizeLibrary
();
}
else
{
ITAPA
.
Stop
();
ITAPA
.
Close
();
ITAPA
.
Finalize
();
}
delete
pServer
;
};
int
main
(
int
,
char
**
)
{
try
{
run_test
();
}
catch
(
ITAException
&
ie
)
{
vstr
::
err
()
<<
ie
<<
endl
;
return
255
;
}
catch
(
VistaExceptionBase
&
ve
)
{
vstr
::
err
()
<<
ve
.
GetBacktraceString
()
<<
endl
;
return
255
;
}
return
0
;
}
tests/NetAudio/NetAudioLog.m
View file @
1e4b20ab
...
...
@@ -2,28 +2,38 @@
ITANetAudioTest_Client
=
readtable
(
'ITANetAudioTest_Client.log'
,
'FileType'
,
'text'
,
'Delimiter'
,
'\t'
);
ITANetAudioTest_Server
=
readtable
(
'ITANetAudioTest_Server.log'
,
'FileType'
,
'text'
,
'Delimiter'
,
'\t'
);
ITANetAudioTest_Client_AudioStream
=
readtable
(
'ITANetAudioTest_Client_AudioStream.log'
,
'FileType'
,
'text'
,
'Delimiter'
,
'\t'
);
ITANetAudioTest_Client_NetworkStream
=
readtable
(
'ITANetAudioTest_Client_NetworkStream.log'
,
'FileType'
,
'text'
,
'Delimiter'
,
'\t'
);
%% Settings
B
=
512
;
TL
=
512
*
4
;
RB
=
512
*
8
;
TL
=
B
*
3
;
RB
=
B
*
4
;
%% Analyse
TS
=
min
(
[
ITANetAudioTest_Client
.
WorldTimeStamp
;
ITANetAudioTest_Server
.
WorldTimeStamp
;
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
]
);
TE
=
max
(
[
ITANetAudioTest_Client
.
WorldTimeStamp
;
ITANetAudioTest_Server
.
WorldTimeStamp
;
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
]
);
all_times
=
[
ITANetAudioTest_Client
.
WorldTimeStamp
;
ITANetAudioTest_Server
.
WorldTimeStamp
;
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
;
ITANetAudioTest_Client_NetworkStream
.
WorldTimeStamp
];
TS
=
min
(
all_times
);
TE
=
max
(
all_times
);
AudioStreamingUnderrunIndices
=
find
(
ITANetAudioTest_Client_AudioStream
.
FreeSamples
==
RB
);
AudioStreamingOverrunIndices
=
find
(
ITANetAudioTest_Client_AudioStream
.
FreeSamples
==
0
);
ClientTransmittedBufferInfoIndices
=
find
(
strcmpi
(
ITANetAudioTest_Client
.
TransmittedRingBufferFreeSamples
,
'true'
));
ServerNetCommTiming
=
diff
(
ITANetAudioTest_Server
.
WorldTimeStamp
);
ClientNetCommTiming
=
diff
(
ITANetAudioTest_Client
.
WorldTimeStamp
);
ClientAudioStreamTiming
=
diff
(
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
);
ClientNetStreamTiming
=
diff
(
ITANetAudioTest_Client_NetworkStream
.
WorldTimeStamp
);
%% Plot
subplot
(
2
,
1
,
1
)
% Client
plot
(
ITANetAudioTest_Client
.
WorldTimeStamp
-
TS
,
RB
-
ITANetAudioTest_Client
.
FreeSamples
,
'LineWidth'
,
1
)
hold
on
plot
(
ITANetAudioTest_Client
.
WorldTimeStamp
(
ClientTransmittedBufferInfoIndices
)
-
TS
,
RB
-
ITANetAudioTest_Client
.
FreeSamples
(
ClientTransmittedBufferInfoIndices
),
'
>
'
)
plot
(
ITANetAudioTest_Client
.
WorldTimeStamp
(
ClientTransmittedBufferInfoIndices
)
-
TS
,
RB
-
ITANetAudioTest_Client
.
FreeSamples
(
ClientTransmittedBufferInfoIndices
),
'
^
'
)
hold
on
plot
(
ITANetAudioTest_Client_NetworkStream
.
WorldTimeStamp
-
TS
,
RB
-
ITANetAudioTest_Client_NetworkStream
.
FreeSamples
)
% Estimated by server
plot
(
ITANetAudioTest_Server
.
WorldTimeStamp
-
TS
,
RB
-
ITANetAudioTest_Server
.
EstimatedFreeSamples
,
'LineWidth'
,
1
)
...
...
@@ -45,7 +55,26 @@ hold on
plot
(
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
(
AudioStreamingOverrunIndices
)
-
TS
,
RB
-
ITANetAudioTest_Client_AudioStream
.
FreeSamples
(
AudioStreamingOverrunIndices
)
,
'm*'
)
hold
on
legend
(
{
'R
ingBufferSamples'
,
'BufferInfoTransmit'
,
'Estimated
'
,
'TargetLatency'
,
'RingBufferCapacity'
,
'Underruns'
,
'Overruns'
}
)
legend
(
{
'R
ealBufferStatus'
,
'BufferInfoTransmit'
,
'NetworkStreamBufferStatus'
,
'EstimatedBufferStatus
'
,
'TargetLatency'
,
'RingBufferCapacity'
,
'Underruns'
,
'Overruns'
}
)
ylabel
(
'NumSamples'
)
xlabel
(
'Time'
)
ylim
(
[
-
B
/
10
RB
+
B
/
10
]
);
hold
off
% Timing
subplot
(
2
,
1
,
2
)
plot
(
ITANetAudioTest_Client
.
WorldTimeStamp
(
2
:
end
)
-
TS
,
ClientNetCommTiming
)
hold
on
plot
(
ITANetAudioTest_Client_AudioStream
.
WorldTimeStamp
(
2
:
end
)
-
TS
,
ClientAudioStreamTiming
)
hold
on
plot
(
ITANetAudioTest_Client_NetworkStream
.
WorldTimeStamp
(
2
:
end
)
-
TS
,
ClientNetStreamTiming
)
hold
on
plot
(
ITANetAudioTest_Server
.
WorldTimeStamp
(
2
:
end
)
-
TS
,
ServerNetCommTiming
)
hold
on
title
(
'Clock Timing'
)
legend
(
{
'ClientNet'
,
'ClientAudioStream'
,
'ClientNetStream'
,
'ServerNet'
}
)
ylabel
(
'Process timing'
)
xlabel
(
'Streaming time'
)
hold
off
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment