diff --git a/src/tests/kits/media/Jamfile b/src/tests/kits/media/Jamfile index 7e1d75eecc..37d098a17c 100644 --- a/src/tests/kits/media/Jamfile +++ b/src/tests/kits/media/Jamfile @@ -13,4 +13,6 @@ SimpleTest TimedEventQueueTest : TimedEventQueueTest.cpp SubInclude OBOS_TOP src tests kits media notificationtest ; SubInclude OBOS_TOP src tests kits media nodetest ; SubInclude OBOS_TOP src tests kits media playwav ; +SubInclude OBOS_TOP src tests kits media mp3_reader_test ; +SubInclude OBOS_TOP src tests kits media wav_reader_test ; diff --git a/src/tests/kits/media/mp3_reader_test/FileDataIO.cpp b/src/tests/kits/media/mp3_reader_test/FileDataIO.cpp new file mode 100644 index 0000000000..4ebd5a7bbd --- /dev/null +++ b/src/tests/kits/media/mp3_reader_test/FileDataIO.cpp @@ -0,0 +1,24 @@ +#include "FileDataIO.h" + +FileDataIO::FileDataIO(const char *filepath, uint32 open_mode) + : file(new BFile(filepath, open_mode)) +{ +} + +FileDataIO::~FileDataIO() +{ + delete file; +} + +ssize_t +FileDataIO::Read(void *buffer, size_t size) +{ + return file->Read(buffer, size); +} + +ssize_t +FileDataIO::Write(const void *buffer, size_t size) +{ + return file->Write(buffer, size); +} + diff --git a/src/tests/kits/media/mp3_reader_test/FileDataIO.h b/src/tests/kits/media/mp3_reader_test/FileDataIO.h new file mode 100644 index 0000000000..5e10c8e116 --- /dev/null +++ b/src/tests/kits/media/mp3_reader_test/FileDataIO.h @@ -0,0 +1,20 @@ +#ifndef _FILE_DATA_IO +#define _FILE_DATA_IO + +#include +#include + +class FileDataIO : public BDataIO +{ +public: + FileDataIO(const char *filepath, uint32 open_mode); + ~FileDataIO(); + + ssize_t Read(void *buffer, size_t size); + ssize_t Write(const void *buffer, size_t size); + +private: + BFile *file; +}; + +#endif \ No newline at end of file diff --git a/src/tests/kits/media/mp3_reader_test/Jamfile b/src/tests/kits/media/mp3_reader_test/Jamfile new file mode 100644 index 0000000000..40f22c2189 --- /dev/null +++ b/src/tests/kits/media/mp3_reader_test/Jamfile @@ -0,0 +1,19 @@ +SubDir OBOS_TOP src tests kits media mp3_reader_test ; + +UsePrivateHeaders media ; + +SimpleTest mp3_reader_test + : main.cpp + FileDataIO.cpp + MediaPlugin.cpp + ReaderPlugin.cpp + MP3ReaderPlugin.cpp + : media be root +; + +# Tell Jam where to find these sources +SEARCH on [ FGristFiles MP3ReaderPlugin.cpp ] + = [ FDirName $(OBOS_TOP) src add-ons media plugins mp3_reader ] ; + +SEARCH on [ FGristFiles MediaPlugin.cpp ReaderPlugin.cpp ] + = [ FDirName $(OBOS_TOP) src kits media ] ; diff --git a/src/tests/kits/media/mp3_reader_test/main.cpp b/src/tests/kits/media/mp3_reader_test/main.cpp new file mode 100644 index 0000000000..becf787448 --- /dev/null +++ b/src/tests/kits/media/mp3_reader_test/main.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include "MediaPlugin.h" +#include "ReaderPlugin.h" +#include "FileDataIO.h" + +const bool SEEKABLE = 1; +const char * FILENAME = "/boot/home/Desktop/mediastuff/Apocalyptica Feat. Nina Hagen - Seemann.mp3"; + +#define TRACE_THIS 1 +#if TRACE_THIS + #define TRACE printf +#else + #define TRACE ((void)0) +#endif + +void *cookies[100]; + +int main(int argc, char *argv[]) +{ + TRACE("\n\n"); + + TRACE("main: creating plugin...\n"); + + MediaPlugin *plugin = instantiate_plugin(); + + TRACE("main: creating reader...\n"); + + ReaderPlugin *readerplugin; + readerplugin = dynamic_cast(plugin); + + Reader *reader = readerplugin->NewReader(); + + TRACE("main: opening source file...\n"); + + BDataIO *source; + if (SEEKABLE) + source = new BFile(FILENAME, O_RDWR); + else + source = new FileDataIO(FILENAME, O_RDWR); + + TRACE("main: calling setup...\n"); + + reader->Setup(source); + + TRACE("main: creating ...\n"); + + TRACE("main: copyright: \"%s\"\n", reader->Copyright()); + + status_t s; + int32 streamCount; + + s = reader->Sniff(&streamCount); + if (s != B_OK) { + TRACE("main: Sniff() failed with error %lx (%s)\n", s, strerror(s)); + goto err; + } + + TRACE("main: Sniff() found %ld streams\n", streamCount); + + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling AllocateCookie(stream = %d)\n", i); + s = reader->AllocateCookie(i, &cookies[i]); + if (s != B_OK) { + TRACE("main: AllocateCookie(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + } + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling GetStreamInfo(stream = %d)\n", i); + int64 frameCount; + bigtime_t duration; + media_format format; + void *infoBuffer; + int32 infoSize; + s = reader->GetStreamInfo(cookies[i], &frameCount, &duration, &format, &infoBuffer, &infoSize); + if (s != B_OK) { + TRACE("main: GetStreamInfo(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + TRACE("main: GetStreamInfo(stream = %d) result: %Ld frames, %.6f sec\n", i, frameCount, duration / 1000000.0); + } + + for (int i = 0; i < streamCount; i++) { + void *chunkBuffer; + int32 chunkSize; + media_header mediaHeader; + for (int j = 0; j < 5; j++) { + s = reader->GetNextChunk(cookies[i], &chunkBuffer, &chunkSize, &mediaHeader); + if (s != B_OK) { + TRACE("main: GetNextChunk(stream = %d, chunk = %d) failed with error %lx (%s)\n", i, j, s, strerror(s)); + break; + } + } + + int64 frame; + bigtime_t time; + + time = 1000000; // 1 sec + TRACE("main: calling Seek(stream = %d, time %.6f forward)\n", i, time / 1000000.0); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + frame = 1000; + TRACE("main: calling Seek(stream = %d, frame %Ld forward)\n", i, frame); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + time = 1000000; // 1 sec + TRACE("main: calling Seek(stream = %d, time %.6f backward)\n", i, time / 1000000.0); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + frame = 1000; + TRACE("main: calling Seek(stream = %d, frame %Ld backward)\n", i, frame); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + } + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling FreeCookie(stream = %d)\n", i); + s = reader->FreeCookie(cookies[i]); + if (s != B_OK) { + TRACE("main: FreeCookie(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + } + +err: + delete reader; + delete plugin; + delete source; + return 0; +} + diff --git a/src/tests/kits/media/wav_reader_test/FileDataIO.cpp b/src/tests/kits/media/wav_reader_test/FileDataIO.cpp new file mode 100644 index 0000000000..4ebd5a7bbd --- /dev/null +++ b/src/tests/kits/media/wav_reader_test/FileDataIO.cpp @@ -0,0 +1,24 @@ +#include "FileDataIO.h" + +FileDataIO::FileDataIO(const char *filepath, uint32 open_mode) + : file(new BFile(filepath, open_mode)) +{ +} + +FileDataIO::~FileDataIO() +{ + delete file; +} + +ssize_t +FileDataIO::Read(void *buffer, size_t size) +{ + return file->Read(buffer, size); +} + +ssize_t +FileDataIO::Write(const void *buffer, size_t size) +{ + return file->Write(buffer, size); +} + diff --git a/src/tests/kits/media/wav_reader_test/FileDataIO.h b/src/tests/kits/media/wav_reader_test/FileDataIO.h new file mode 100644 index 0000000000..5e10c8e116 --- /dev/null +++ b/src/tests/kits/media/wav_reader_test/FileDataIO.h @@ -0,0 +1,20 @@ +#ifndef _FILE_DATA_IO +#define _FILE_DATA_IO + +#include +#include + +class FileDataIO : public BDataIO +{ +public: + FileDataIO(const char *filepath, uint32 open_mode); + ~FileDataIO(); + + ssize_t Read(void *buffer, size_t size); + ssize_t Write(const void *buffer, size_t size); + +private: + BFile *file; +}; + +#endif \ No newline at end of file diff --git a/src/tests/kits/media/wav_reader_test/Jamfile b/src/tests/kits/media/wav_reader_test/Jamfile new file mode 100644 index 0000000000..8a4e654cf1 --- /dev/null +++ b/src/tests/kits/media/wav_reader_test/Jamfile @@ -0,0 +1,19 @@ +SubDir OBOS_TOP src tests kits media wav_reader_test ; + +UsePrivateHeaders media ; + +SimpleTest wav_reader_test + : main.cpp + FileDataIO.cpp + MediaPlugin.cpp + ReaderPlugin.cpp + WavReaderPlugin.cpp + : media be root +; + +# Tell Jam where to find these sources +SEARCH on [ FGristFiles WavReaderPlugin.cpp ] + = [ FDirName $(OBOS_TOP) src add-ons media plugins wav_reader ] ; + +SEARCH on [ FGristFiles MediaPlugin.cpp ReaderPlugin.cpp ] + = [ FDirName $(OBOS_TOP) src kits media ] ; diff --git a/src/tests/kits/media/wav_reader_test/main.cpp b/src/tests/kits/media/wav_reader_test/main.cpp new file mode 100644 index 0000000000..f292a515c0 --- /dev/null +++ b/src/tests/kits/media/wav_reader_test/main.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include "MediaPlugin.h" +#include "ReaderPlugin.h" +#include "FileDataIO.h" + +const bool SEEKABLE = 1; +const char * FILENAME = "/boot/home/Desktop/mediastuff/test1.wav"; + +#define TRACE_THIS 1 +#if TRACE_THIS + #define TRACE printf +#else + #define TRACE ((void)0) +#endif + +void *cookies[100]; + +int main(int argc, char *argv[]) +{ + TRACE("\n\n"); + + TRACE("main: creating plugin...\n"); + + MediaPlugin *plugin = instantiate_plugin(); + + TRACE("main: creating reader...\n"); + + ReaderPlugin *readerplugin; + readerplugin = dynamic_cast(plugin); + + Reader *reader = readerplugin->NewReader(); + + TRACE("main: opening source file...\n"); + + BDataIO *source; + if (SEEKABLE) + source = new BFile(FILENAME, O_RDWR); + else + source = new FileDataIO(FILENAME, O_RDWR); + + TRACE("main: calling setup...\n"); + + reader->Setup(source); + + TRACE("main: creating ...\n"); + + TRACE("main: copyright: \"%s\"\n", reader->Copyright()); + + status_t s; + int32 streamCount; + + s = reader->Sniff(&streamCount); + if (s != B_OK) { + TRACE("main: Sniff() failed with error %lx (%s)\n", s, strerror(s)); + goto err; + } + + TRACE("main: Sniff() found %ld streams\n", streamCount); + + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling AllocateCookie(stream = %d)\n", i); + s = reader->AllocateCookie(i, &cookies[i]); + if (s != B_OK) { + TRACE("main: AllocateCookie(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + } + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling GetStreamInfo(stream = %d)\n", i); + int64 frameCount; + bigtime_t duration; + media_format format; + void *infoBuffer; + int32 infoSize; + s = reader->GetStreamInfo(cookies[i], &frameCount, &duration, &format, &infoBuffer, &infoSize); + if (s != B_OK) { + TRACE("main: GetStreamInfo(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + TRACE("main: GetStreamInfo(stream = %d) result: %Ld frames, %.6f sec\n", i, frameCount, duration / 1000000.0); + } + + for (int i = 0; i < streamCount; i++) { + void *chunkBuffer; + int32 chunkSize; + media_header mediaHeader; + for (int j = 0; j < 5; j++) { + s = reader->GetNextChunk(cookies[i], &chunkBuffer, &chunkSize, &mediaHeader); + if (s != B_OK) { + TRACE("main: GetNextChunk(stream = %d, chunk = %d) failed with error %lx (%s)\n", i, j, s, strerror(s)); + break; + } + } + + int64 frame; + bigtime_t time; + + time = 1000000; // 1 sec + TRACE("main: calling Seek(stream = %d, time %.6f forward)\n", i, time / 1000000.0); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + frame = 1000; + TRACE("main: calling Seek(stream = %d, frame %Ld forward)\n", i, frame); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + time = 1000000; // 1 sec + TRACE("main: calling Seek(stream = %d, time %.6f backward)\n", i, time / 1000000.0); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + + frame = 1000; + TRACE("main: calling Seek(stream = %d, frame %Ld backward)\n", i, frame); + s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time); + TRACE("main: Seek result: time %.6f, frame %Ld\n", time / 1000000.0, frame); + } + + for (int i = 0; i < streamCount; i++) { + TRACE("main: calling FreeCookie(stream = %d)\n", i); + s = reader->FreeCookie(cookies[i]); + if (s != B_OK) { + TRACE("main: FreeCookie(stream = %d) failed with error %lx (%s)\n", i, s, strerror(s)); + goto err; + } + } + +err: + delete reader; + delete plugin; + delete source; + return 0; +} +