Finalizing description for publication

parent b3f9d3d1
## ITADataSources ## ITADataSources
ITADataSources is a C++ library for component-oriented audio streaming providing basic modules to manipulate samples in a block-based audio processing. ITADataSources is a C++ library for component-oriented audio streaming providing basic modules to manipulate samples in a block-based audio processing.
It is marked deprecated because it will be substituted by the module-base [ITAStreaming](https://git.rwth-aachen.de/ita/ITAStreaming) project in the future, but is still heavily used and updated. In future it may be substituted by the new module-base [ITAStreaming](https://git.rwth-aachen.de/ita/ITAStreaming) project, but is still heavily used and therefore also updated.
ITADataSources is a component from [ITACoreLibs](https://git.rwth-aachen.de/ita/ITACoreLibs), a collection of C++ libraries for virtual acoustics. ITADataSources is a component of [ITACoreLibs](https://git.rwth-aachen.de/ita/ITACoreLibs), a collection of C++ libraries for virtual acoustics.
### License ### License
See [LICENSE](LICENSE.md) file. Copyright 2015-2017 Institute of Technical Acoustics, RWTH Aachen University
Licensed under the Apache License, Version 2.0 (the "License");
you may not use files of this project except in compliance with the License.
You may obtain a copy of the License at
<http://www.apache.org/licenses/LICENSE-2.0>
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
### Quick build guide ### Quick build guide
Follow instructions from Wiki pages of [ITABase](https://git.rwth-aachen.de/ita/ITABase/wikis/home) project. It is recommended to clone and follow the build guide of the parent project [ITACoreLibs](https://git.rwth-aachen.de/ita/ITACoreLibs/wikis/home), which includes this project as a submodule.
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#define INCLUDE_WATCHER_ITA_BUFFER_DATA_SOURCE #define INCLUDE_WATCHER_ITA_BUFFER_DATA_SOURCE
#include <ITADataSourcesDefinitions.h> #include <ITADataSourcesDefinitions.h>
#include <ITADataSource.h> #include <ITADataSource.h>
#include <ITAAtomicPrimitives.h> #include <ITAAtomicPrimitives.h>
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
* legt ITABufferDatasource die Kapazität als nächstkleineres Blocklänge-Vielfaches * legt ITABufferDatasource die Kapazität als nächstkleineres Blocklänge-Vielfaches
* der Buffergröße (uiBufferSize) fest. * der Buffergröße (uiBufferSize) fest.
* *
* Die Klasse bietet ferner die Möglichkeit einen bestimmten Bereich der Puffer * Die Klasse bietet ferner die Möglichkeit einen bestimmten Bereich der Puffer
* für das Freisetzen der Audiodaten zu benutzen, den sogenannten Arbeitsbereich * für das Freisetzen der Audiodaten zu benutzen, den sogenannten Arbeitsbereich
* (<i>region of interest, ROI</i>). Zwei Wiedergabemodi werden unterstützt: * (<i>region of interest, ROI</i>). Zwei Wiedergabemodi werden unterstützt:
* Einmaliges Freisetzen/Abspielen und Wiederholung. * Einmaliges Freisetzen/Abspielen und Wiederholung.
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
* Über den geschützen Konstruktor und die geschützte Init-Methode können von * Über den geschützen Konstruktor und die geschützte Init-Methode können von
* ITABufferDatasource abgeleitete Klasse eine verzögert Initialisierung und damit * ITABufferDatasource abgeleitete Klasse eine verzögert Initialisierung und damit
* Festgelegung auf konkrete Puffer und Parameter realisieren. Dies ist notwendig, * Festgelegung auf konkrete Puffer und Parameter realisieren. Dies ist notwendig,
* wenn beim Aufruf des ITABufferDatasource-Konstruktors diese Parameter noch nicht * wenn beim Aufruf des ITABufferDatasource-Konstruktors diese Parameter noch nicht
* bekannt sind. Instanzen müssen dann mittels der Init-Methode initialisiert werden. * bekannt sind. Instanzen müssen dann mittels der Init-Methode initialisiert werden.
* *
* \important <b>Thread-Safety</b>: Ist in dieser Implementierung nicht konsequent durchgezogen. * \important <b>Thread-Safety</b>: Ist in dieser Implementierung nicht konsequent durchgezogen.
...@@ -54,10 +54,11 @@ ...@@ -54,10 +54,11 @@
* und einem speziellen Einsatzschema der Klasse, beidem Thread-safety ausserhalb * und einem speziellen Einsatzschema der Klasse, beidem Thread-safety ausserhalb
* der Klasse realisiert wird, wurde auf eine strikte Thread-sichere Implementierung zunächst * der Klasse realisiert wird, wurde auf eine strikte Thread-sichere Implementierung zunächst
* verzichtet. But remember: <b>You have been warned!</b> :-P [fwe: Dezember 2005] * verzichtet. But remember: <b>You have been warned!</b> :-P [fwe: Dezember 2005]
* *
* \ingroup datasources * \ingroup datasources
*/ */
class ITA_DATA_SOURCES_API ITABufferDatasource : public ITADatasource { class ITA_DATA_SOURCES_API ITABufferDatasource : public ITADatasource
{
public: public:
//! Konstruktor (2D-Array) //! Konstruktor (2D-Array)
/** /**
...@@ -68,14 +69,9 @@ public: ...@@ -68,14 +69,9 @@ public:
* \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll * \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll
* \param bLoopMode Wiederholungsmodus? [Optional] * \param bLoopMode Wiederholungsmodus? [Optional]
* *
* \note Bei ungültigen Parametern wird eine Ausnahme vom Typ LLCException ausgelöst * \note Bei ungültigen Parametern wird eine Ausnahme vom Typ ITAException ausgelöst
*/ */
ITABufferDatasource(const float** ppfBuffer, ITABufferDatasource( const float** ppfBuffer, unsigned int uiChannels, unsigned int uiBuffersize, double dSamplerate, unsigned int uiBlocklength, bool bLoopMode = false );
unsigned int uiChannels,
unsigned int uiBuffersize,
double dSamplerate,
unsigned int uiBlocklength,
bool bLoopMode=false);
//! Konstruktor (Vektor von Arrays) //! Konstruktor (Vektor von Arrays)
/** /**
...@@ -86,13 +82,9 @@ public: ...@@ -86,13 +82,9 @@ public:
* \param bLoopMode Wiederholungsmodus? [Optional] * \param bLoopMode Wiederholungsmodus? [Optional]
* *
* \note Die Kanalanzahl wird aus der Anzahl der Elemente im Vektor bestimmt * \note Die Kanalanzahl wird aus der Anzahl der Elemente im Vektor bestimmt
* \note Bei ungültigen Parametern wird eine Ausnahme vom Typ LLCException ausgelöst * \note Bei ungültigen Parametern wird eine Ausnahme vom Typ CIAException ausgelöst
*/ */
ITABufferDatasource(const std::vector<float*>& vpfBuffer, ITABufferDatasource( const std::vector< float* >& vpfBuffer, unsigned int uiBuffersize, double dSamplerate, unsigned int uiBlocklength, bool bLoopMode = false );
unsigned int uiBuffersize,
double dSamplerate,
unsigned int uiBlocklength,
bool bLoopMode=false);
//! Spezieller Konstruktor (Einkanal-Betrieb) //! Spezieller Konstruktor (Einkanal-Betrieb)
/** /**
...@@ -104,18 +96,18 @@ public: ...@@ -104,18 +96,18 @@ public:
* \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll * \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll
* \param bLoopMode Wiederholungsmodus? [Optional] * \param bLoopMode Wiederholungsmodus? [Optional]
* *
* \note Bei ungültigen Parametern wird eine Ausnahme vom Typ LLCException ausgelöst * \note Bei ungültigen Parametern wird eine Ausnahme vom Typ CITAException ausgelöst
*/ */
ITABufferDatasource(const float* pfBuffer, ITABufferDatasource( const float* pfBuffer,
unsigned int uiBuffersize, unsigned int uiBuffersize,
double dSamplerate, double dSamplerate,
unsigned int uiBlocklength, unsigned int uiBlocklength,
bool bLoopMode=false); bool bLoopMode = false );
//! Kapazität der Datenquelle zurückgeben //! Kapazität der Datenquelle zurückgeben
/** /**
* Gibt die Anzahl der Samples der Daten der Quelle zurück. * Gibt die Anzahl der Samples der Daten der Quelle zurück.
* Dieser Wert ist das nächstkleinere Blocklängen-Vielfache der * Dieser Wert ist das nächstkleinere Blocklängen-Vielfache der
* Pufferlänge uiBuffersize und muß somit nicht unbedingt dem * Pufferlänge uiBuffersize und muß somit nicht unbedingt dem
* wert uiBuffersize entsprechen. Er ist unabhängig von der * wert uiBuffersize entsprechen. Er ist unabhängig von der
* Wahl des Start- und Endcursors und kann als Obergrenze für * Wahl des Start- und Endcursors und kann als Obergrenze für
...@@ -137,30 +129,30 @@ public: ...@@ -137,30 +129,30 @@ public:
unsigned int GetCursor(); unsigned int GetCursor();
//! Wiedergabeposition setzen bezogen auf den Arbeitsbereich //! Wiedergabeposition setzen bezogen auf den Arbeitsbereich
void SetCursor(unsigned int uiNewCursor); void SetCursor( unsigned int uiNewCursor );
//! Wiedergabe pausiert? //! Wiedergabe pausiert?
bool IsPaused() const; bool IsPaused() const;
//! Pausierung für Wiedergabe ein-/ausschalten //! Pausierung für Wiedergabe ein-/ausschalten
void SetPaused(bool bPaused); void SetPaused( bool bPaused );
//! Zurückgeben ob die Wiederholung eingeschaltet ist //! Zurückgeben ob die Wiederholung eingeschaltet ist
bool GetLoopMode(); bool GetLoopMode();
//! Wiederholung Ein-/Ausschalten //! Wiederholung Ein-/Ausschalten
void SetLoopMode(bool bLoopMode); void SetLoopMode( bool bLoopMode );
//! Sets the looping mode //! Sets the looping mode
/** /**
* @param[in] bLoopingEnabled True means looping, false will play until EOF * @param[in] bLoopingEnabled True means looping, false will play until EOF
*/ */
void SetIsLooping( bool bLoopingEnabled ); void SetIsLooping( bool bLoopingEnabled );
//! Looping mode getter //! Looping mode getter
/** /**
* @return True means looping, false will play until EOF * @return True means looping, false will play until EOF
*/ */
bool GetIsLooping(); bool GetIsLooping();
//! Arbeitsbereich (region of interest) festlegen //! Arbeitsbereich (region of interest) festlegen
...@@ -168,15 +160,15 @@ public: ...@@ -168,15 +160,15 @@ public:
* Legt den Arbeitsbereich fest, d.h. das Interval in den Quellendaten, aus dem die * Legt den Arbeitsbereich fest, d.h. das Interval in den Quellendaten, aus dem die
* Quelle ihre Daten freisetzt. Dabei stellt uiStartOffset die Nummer des Samples * Quelle ihre Daten freisetzt. Dabei stellt uiStartOffset die Nummer des Samples
* dar, an dem der Arbeitsbereich beginnt. Dieser Wert muß NICHT unbedingt ein Vielfaches der * dar, an dem der Arbeitsbereich beginnt. Dieser Wert muß NICHT unbedingt ein Vielfaches der
* Blöcklänge sein und darf frei gewählt werden. Der Wert uiEndOffset ist die Nummer * Blöcklänge sein und darf frei gewählt werden. Der Wert uiEndOffset ist die Nummer
* des ersten Samples, welches nicht mehr im Arbeitsbereich enthalten ist. * des ersten Samples, welches nicht mehr im Arbeitsbereich enthalten ist.
* Somit ist definieren beide Werte das HALBOFFENE Interval [uiStartOffset, uiEndOffset). * Somit ist definieren beide Werte das HALBOFFENE Interval [uiStartOffset, uiEndOffset).
* Die Datenquelle setzt also Audiodaten aus dem Bereich [uiStartOffset, uiEndOffset-1] * Die Datenquelle setzt also Audiodaten aus dem Bereich [uiStartOffset, uiEndOffset-1]
* frei. Das Ende des Arbeitsbereiches uiEndOffset wird von der Methode so * frei. Das Ende des Arbeitsbereiches uiEndOffset wird von der Methode so
* angepasst, das die Differenz uiEndOffset-uiStartOffset das nächstkleinere Vielfache * angepasst, das die Differenz uiEndOffset-uiStartOffset das nächstkleinere Vielfache
* der Blocklänge ergibt. * der Blocklänge ergibt.
*/ */
void SetROI(unsigned int uiStartOffset, unsigned int uiEndOffset); void SetROI( unsigned int uiStartOffset, unsigned int uiEndOffset );
//! Startposition des Arbeitsbereiches (region of interest) zurückgeben //! Startposition des Arbeitsbereiches (region of interest) zurückgeben
unsigned int GetROIStart(); unsigned int GetROIStart();
...@@ -206,7 +198,7 @@ public: ...@@ -206,7 +198,7 @@ public:
unsigned int GetNumberOfChannels() const; unsigned int GetNumberOfChannels() const;
double GetSampleRate() const; double GetSampleRate() const;
const float* GetBlockPointer(unsigned int uiChannel, const ITAStreamInfo* pStreamInfo); const float* GetBlockPointer( unsigned int uiChannel, const ITAStreamInfo* pStreamInfo );
void IncrementBlockPointer(); void IncrementBlockPointer();
protected: protected:
...@@ -226,11 +218,11 @@ protected: ...@@ -226,11 +218,11 @@ protected:
/** /**
* Zu benutzen im Verbund mit dem geschützen Konstruktor. * Zu benutzen im Verbund mit dem geschützen Konstruktor.
*/ */
void Init(const std::vector<float*>& vpfBuffer, void Init( const std::vector<float*>& vpfBuffer,
unsigned int uiBuffersize, unsigned int uiBuffersize,
double dSamplerate, double dSamplerate,
unsigned int uiBlocklength, unsigned int uiBlocklength,
bool bLoopMode); bool bLoopMode );
private: private:
unsigned int m_uiBuffersize; // Größe der einzelnen Kanalpuffer unsigned int m_uiBuffersize; // Größe der einzelnen Kanalpuffer
......
#include <ITADataSourceUtils.h> #include <ITADataSourceUtils.h>
// Wichtig: Folgendes Makro definiert Windows-NT als Umgebung und
// bewirkt somit die Nutzbarkeit der WaitableTimer.
#define _WIN32_WINNT 0x0500
#include <ITADataSource.h> #include <ITADataSource.h>
#include <ITAStreamInfo.h> #include <ITAStreamInfo.h>
#include <ITAAudiofileWriter.h> #include <ITAAudiofileWriter.h>
......
/*
+------------------------------------------------------------+
| |
| ThreadInit.cpp |
| |
| Testprogramm aus der Testsuite des ITAsioInterface |
| |
| Beschreibung: Test zur ASIO-Initialisierung |
| in Threads |
| |
| Author: Frank Wefers |
| Letzte nderung: 13.04.2011 [stienen] |
| |
| (c) Copyright Institut fr technische Akustik (ITA) |
| Aachen university of technology (RWTH), 2011 |
| |
+------------------------------------------------------------+
*/
// $Id: ThreadInit.cpp 1801 2011-04-13 14:07:25Z stienen $
#include <ITAAsioInterface.h> #include <ITAAsioInterface.h>
#include <process.h> #include <process.h>
#include <stdio.h> #include <stdio.h>
#include <string> #include <string>
#define _WIN32_WINNT 0x0500
#include <windows.h> #include <windows.h>
int test(const char* pszDriverName) { int test( const char* pszDriverName ) {
ITAsioInitializeLibrary(); ITAsioInitializeLibrary();
// Treiber anzeigen // Treiber anzeigen
long lDrivers = ITAsioGetNumDrivers(); long lDrivers = ITAsioGetNumDrivers();
if (lDrivers > 0) { if( lDrivers > 0 ) {
printf("Folgende ASIO-Treiber wurden gefunden:\n\n"); printf( "Folgende ASIO-Treiber wurden gefunden:\n\n" );
for (long i=0; i<lDrivers; i++) { for( long i = 0; i < lDrivers; i++ ) {
printf("\t[%d]\t%s\n", i+1, ITAsioGetDriverName(i)); printf( "\t[%d]\t%s\n", i + 1, ITAsioGetDriverName( i ) );
} }
} else { }
printf("Keine ASIO-Treiber gefunden!\n"); else {
printf( "Keine ASIO-Treiber gefunden!\n" );
return 0; return 0;
}; };
// Treiber initialisieren // Treiber initialisieren
printf("Initialisiere Treiber \"%s\"\n", pszDriverName); printf( "Initialisiere Treiber \"%s\"\n", pszDriverName );
ASIOError ae = ITAsioInitializeDriver( pszDriverName ); ASIOError ae = ITAsioInitializeDriver( pszDriverName );
if (ae == ASE_OK) { if( ae == ASE_OK ) {
printf("Initialisierung erfolgreich!"); printf( "Initialisierung erfolgreich!" );
ITAsioFinalizeDriver(); ITAsioFinalizeDriver();
} else { }
printf("Initialisierung fehlgeschlagen (errorcode %d: %s)\n", else {
ae, ITAsioGetErrorStr(ae)); printf( "Initialisierung fehlgeschlagen (errorcode %d: %s)\n",
ae, ITAsioGetErrorStr( ae ) );
return -1; return -1;
} }
...@@ -59,36 +39,37 @@ int test(const char* pszDriverName) { ...@@ -59,36 +39,37 @@ int test(const char* pszDriverName) {
return 0; return 0;
} }
void ThreadProc(void* pParam) { void ThreadProc( void* pParam ) {
printf("Thread ist gestartet!\n"); printf( "Thread ist gestartet!\n" );
// COM initialisieren (Appartment) // COM initialisieren (Appartment)
//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (test((const char*) pParam) != 0) { if( test( ( const char* ) pParam ) != 0 ) {
//CoUninitialize(); //CoUninitialize();
} }
_endthread(); _endthread();
} }
int main(int argc, char* argv[]) { int main( int argc, char* argv[] ) {
// COM initialisieren (Appartment) // COM initialisieren (Appartment)
//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (argc != 2) { if( argc != 2 ) {
fprintf(stderr, "Syntax: ThreadInit TREIBERNUMMER\n"); fprintf( stderr, "Syntax: ThreadInit TREIBERNUMMER\n" );
return 255; return 255;
} }
bool bThreaded = true; bool bThreaded = true;
if (bThreaded) { if( bThreaded ) {
HANDLE hThread = (HANDLE) _beginthread( ThreadProc, 0, argv[1] ); HANDLE hThread = ( HANDLE ) _beginthread( ThreadProc, 0, argv[ 1 ] );
WaitForSingleObject(hThread, INFINITE); WaitForSingleObject( hThread, INFINITE );
} else }
test(argv[1]); else
test( argv[ 1 ] );
//CoUninitialize(); //CoUninitialize();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment