Finalizing description for publication

parent b3f9d3d1
## 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
<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
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 @@
#define INCLUDE_WATCHER_ITA_BUFFER_DATA_SOURCE
#include <ITADataSourcesDefinitions.h>
#include <ITADataSource.h>
#include <ITAAtomicPrimitives.h>
......@@ -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
* (<i>region of interest, ROI</i>). 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 <b>Thread-Safety</b>: 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: <b>You have been warned!</b> :-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<float*>& 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<float*>& vpfBuffer,
unsigned int uiBuffersize,
double dSamplerate,
unsigned int uiBlocklength,
bool bLoopMode);
void Init( const std::vector<float*>& vpfBuffer,
unsigned int uiBuffersize,
double dSamplerate,
unsigned int uiBlocklength,
bool bLoopMode );
private:
unsigned int m_uiBuffersize; // Größe der einzelnen Kanalpuffer
......
#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 <ITAStreamInfo.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 <process.h>
#include <stdio.h>
#include <string>
#define _WIN32_WINNT 0x0500
#include <windows.h>
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<lDrivers; i++) {
printf("\t[%d]\t%s\n", i+1, ITAsioGetDriverName(i));
if( lDrivers > 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();
......
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