From 87b82f9a45babe4a44bc6ff4bdb51601b26b3576 Mon Sep 17 00:00:00 2001 From: Jonas Stienen Date: Fri, 26 May 2017 07:50:43 +0200 Subject: [PATCH] Finalizing description for publication --- README.md | 22 +++++++-- include/ITABufferDataSource.h | 74 ++++++++++++++----------------- src/ITADataSourceUtils.cpp | 4 -- tests/ITAAsioTests/ThreadInit.cpp | 73 +++++++++++------------------- 4 files changed, 78 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index 5e0807f..2822441 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,27 @@ ## ITADataSources 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. -ITADataSources is a component from [ITACoreLibs](https://git.rwth-aachen.de/ita/ITACoreLibs), a collection of C++ libraries for virtual acoustics. +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 of [ITACoreLibs](https://git.rwth-aachen.de/ita/ITACoreLibs), a collection of C++ libraries for virtual acoustics. + ### 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 + + + +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 -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. diff --git a/include/ITABufferDataSource.h b/include/ITABufferDataSource.h index f834a80..674b48a 100644 --- a/include/ITABufferDataSource.h +++ b/include/ITABufferDataSource.h @@ -20,7 +20,7 @@ #define INCLUDE_WATCHER_ITA_BUFFER_DATA_SOURCE #include - + #include #include @@ -38,7 +38,7 @@ * legt ITABufferDatasource die Kapazität als nächstkleineres Blocklänge-Vielfaches * 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 * (region of interest, ROI). Zwei Wiedergabemodi werden unterstützt: * Einmaliges Freisetzen/Abspielen und Wiederholung. @@ -46,7 +46,7 @@ * Über den geschützen Konstruktor und die geschützte Init-Methode können von * ITABufferDatasource abgeleitete Klasse eine verzögert Initialisierung und damit * 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. * * \important Thread-Safety: Ist in dieser Implementierung nicht konsequent durchgezogen. @@ -54,10 +54,11 @@ * und einem speziellen Einsatzschema der Klasse, beidem Thread-safety ausserhalb * der Klasse realisiert wird, wurde auf eine strikte Thread-sichere Implementierung zunächst * verzichtet. But remember: You have been warned! :-P [fwe: Dezember 2005] - * + * * \ingroup datasources */ -class ITA_DATA_SOURCES_API ITABufferDatasource : public ITADatasource { +class ITA_DATA_SOURCES_API ITABufferDatasource : public ITADatasource +{ public: //! Konstruktor (2D-Array) /** @@ -68,14 +69,9 @@ public: * \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll * \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, - unsigned int uiChannels, - unsigned int uiBuffersize, - double dSamplerate, - unsigned int uiBlocklength, - bool bLoopMode=false); + ITABufferDatasource( const float** ppfBuffer, unsigned int uiChannels, unsigned int uiBuffersize, double dSamplerate, unsigned int uiBlocklength, bool bLoopMode = false ); //! Konstruktor (Vektor von Arrays) /** @@ -86,13 +82,9 @@ public: * \param bLoopMode Wiederholungsmodus? [Optional] * * \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& vpfBuffer, - unsigned int uiBuffersize, - double dSamplerate, - unsigned int uiBlocklength, - bool bLoopMode=false); + ITABufferDatasource( const std::vector< float* >& vpfBuffer, unsigned int uiBuffersize, double dSamplerate, unsigned int uiBlocklength, bool bLoopMode = false ); //! Spezieller Konstruktor (Einkanal-Betrieb) /** @@ -104,18 +96,18 @@ public: * \param uiBlocklength Blocklänge mit der die Datenquelle arbeiten soll * \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, - unsigned int uiBuffersize, - double dSamplerate, - unsigned int uiBlocklength, - bool bLoopMode=false); + ITABufferDatasource( const float* pfBuffer, + unsigned int uiBuffersize, + double dSamplerate, + unsigned int uiBlocklength, + bool bLoopMode = false ); //! Kapazität der Datenquelle zurückgeben - /** + /** * 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 * wert uiBuffersize entsprechen. Er ist unabhängig von der * Wahl des Start- und Endcursors und kann als Obergrenze für @@ -137,30 +129,30 @@ public: unsigned int GetCursor(); //! Wiedergabeposition setzen bezogen auf den Arbeitsbereich - void SetCursor(unsigned int uiNewCursor); + void SetCursor( unsigned int uiNewCursor ); //! Wiedergabe pausiert? bool IsPaused() const; - + //! Pausierung für Wiedergabe ein-/ausschalten - void SetPaused(bool bPaused); + void SetPaused( bool bPaused ); //! Zurückgeben ob die Wiederholung eingeschaltet ist bool GetLoopMode(); //! Wiederholung Ein-/Ausschalten - void SetLoopMode(bool bLoopMode); + void SetLoopMode( bool bLoopMode ); //! Sets the looping mode /** * @param[in] bLoopingEnabled True means looping, false will play until EOF */ void SetIsLooping( bool bLoopingEnabled ); - + //! Looping mode getter /** * @return True means looping, false will play until EOF - */ + */ bool GetIsLooping(); //! Arbeitsbereich (region of interest) festlegen @@ -168,15 +160,15 @@ public: * 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 * 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. - * 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] * frei. Das Ende des Arbeitsbereiches uiEndOffset wird von der Methode so * angepasst, das die Differenz uiEndOffset-uiStartOffset das nächstkleinere Vielfache * 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 unsigned int GetROIStart(); @@ -206,7 +198,7 @@ public: unsigned int GetNumberOfChannels() const; double GetSampleRate() const; - const float* GetBlockPointer(unsigned int uiChannel, const ITAStreamInfo* pStreamInfo); + const float* GetBlockPointer( unsigned int uiChannel, const ITAStreamInfo* pStreamInfo ); void IncrementBlockPointer(); protected: @@ -226,11 +218,11 @@ protected: /** * Zu benutzen im Verbund mit dem geschützen Konstruktor. */ - void Init(const std::vector& vpfBuffer, - unsigned int uiBuffersize, - double dSamplerate, - unsigned int uiBlocklength, - bool bLoopMode); + void Init( const std::vector& vpfBuffer, + unsigned int uiBuffersize, + double dSamplerate, + unsigned int uiBlocklength, + bool bLoopMode ); private: unsigned int m_uiBuffersize; // Größe der einzelnen Kanalpuffer diff --git a/src/ITADataSourceUtils.cpp b/src/ITADataSourceUtils.cpp index a601924..5160fd8 100644 --- a/src/ITADataSourceUtils.cpp +++ b/src/ITADataSourceUtils.cpp @@ -1,9 +1,5 @@ #include -// Wichtig: Folgendes Makro definiert Windows-NT als Umgebung und -// bewirkt somit die Nutzbarkeit der WaitableTimer. -#define _WIN32_WINNT 0x0500 - #include #include #include diff --git a/tests/ITAAsioTests/ThreadInit.cpp b/tests/ITAAsioTests/ThreadInit.cpp index 6c6fb63..745caf4 100644 --- a/tests/ITAAsioTests/ThreadInit.cpp +++ b/tests/ITAAsioTests/ThreadInit.cpp @@ -1,56 +1,36 @@ -/* - +------------------------------------------------------------+ - | | - | 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 für technische Akustik (ITA) | - | Aachen university of technology (RWTH), 2011 | - | | - +------------------------------------------------------------+ -*/ - -// $Id: ThreadInit.cpp 1801 2011-04-13 14:07:25Z stienen $ - #include #include #include #include -#define _WIN32_WINNT 0x0500 #include -int test(const char* pszDriverName) { +int test( const char* pszDriverName ) { ITAsioInitializeLibrary(); // Treiber anzeigen long lDrivers = ITAsioGetNumDrivers(); - if (lDrivers > 0) { - printf("Folgende ASIO-Treiber wurden gefunden:\n\n"); - for (long i=0; i 0 ) { + printf( "Folgende ASIO-Treiber wurden gefunden:\n\n" ); + for( long i = 0; i < lDrivers; 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; }; // Treiber initialisieren - printf("Initialisiere Treiber \"%s\"\n", pszDriverName); + printf( "Initialisiere Treiber \"%s\"\n", pszDriverName ); ASIOError ae = ITAsioInitializeDriver( pszDriverName ); - if (ae == ASE_OK) { - printf("Initialisierung erfolgreich!"); + if( ae == ASE_OK ) { + printf( "Initialisierung erfolgreich!" ); ITAsioFinalizeDriver(); - } else { - printf("Initialisierung fehlgeschlagen (errorcode %d: %s)\n", - ae, ITAsioGetErrorStr(ae)); + } + else { + printf( "Initialisierung fehlgeschlagen (errorcode %d: %s)\n", + ae, ITAsioGetErrorStr( ae ) ); return -1; } @@ -59,36 +39,37 @@ int test(const char* pszDriverName) { return 0; } -void ThreadProc(void* pParam) { - printf("Thread ist gestartet!\n"); +void ThreadProc( void* pParam ) { + printf( "Thread ist gestartet!\n" ); // COM initialisieren (Appartment) //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (test((const char*) pParam) != 0) { + if( test( ( const char* ) pParam ) != 0 ) { //CoUninitialize(); } _endthread(); } -int main(int argc, char* argv[]) { +int main( int argc, char* argv[] ) { // COM initialisieren (Appartment) //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (argc != 2) { - fprintf(stderr, "Syntax: ThreadInit TREIBERNUMMER\n"); + if( argc != 2 ) { + fprintf( stderr, "Syntax: ThreadInit TREIBERNUMMER\n" ); return 255; } bool bThreaded = true; - if (bThreaded) { - HANDLE hThread = (HANDLE) _beginthread( ThreadProc, 0, argv[1] ); - WaitForSingleObject(hThread, INFINITE); - } else - test(argv[1]); + if( bThreaded ) { + HANDLE hThread = ( HANDLE ) _beginthread( ThreadProc, 0, argv[ 1 ] ); + WaitForSingleObject( hThread, INFINITE ); + } + else + test( argv[ 1 ] ); //CoUninitialize(); -- GitLab