diff --git a/src/tests/kits/media/Jamfile b/src/tests/kits/media/Jamfile index cda2b62477..7e1d75eecc 100644 --- a/src/tests/kits/media/Jamfile +++ b/src/tests/kits/media/Jamfile @@ -12,4 +12,5 @@ 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 ; diff --git a/src/tests/kits/media/playwav/Jamfile b/src/tests/kits/media/playwav/Jamfile new file mode 100644 index 0000000000..39940acd6f --- /dev/null +++ b/src/tests/kits/media/playwav/Jamfile @@ -0,0 +1,8 @@ +SubDir OBOS_TOP src tests kits media playwav ; + +UsePrivateHeaders media ; + +SimpleTest playwav + : playwav.cpp + : media be root +; diff --git a/src/tests/kits/media/playwav/playwav.cpp b/src/tests/kits/media/playwav/playwav.cpp new file mode 100644 index 0000000000..7a0e650e9f --- /dev/null +++ b/src/tests/kits/media/playwav/playwav.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include + +#define USE_NEW_PLAYER 0 + +#if USE_NEW_PLAYER + #define NAMESPACE BExperimental:: + #include "NewSoundPlayer.h" +#else + #define NAMESPACE + #include +#endif + +#define FILENAME "/boot/home/test1.wav" +#define SIZE 2048 + +port_id port = -1; +sem_id finished = -1; +int fd = -1; +NAMESPACE BSoundPlayer *sp = 0; + +inline float abs(float f) { return f < 0 ? -f : f; } + +void PlayBuffer(void *cookie, void * buffer, size_t size, const media_raw_audio_format & format) +{ + size_t portsize = port_buffer_size(port); + int32 code; + + read_port(port, &code, buffer, portsize); + + if (size != portsize) { + sp->SetHasData(false); + release_sem(finished); + } +} + +int32 filereader(void *arg) +{ + char buffer[SIZE]; + int size; + + printf("file reader started\n"); + + for (;;) { + size = read(fd, buffer, SIZE); + write_port(port, 0, buffer, size); + if (size != SIZE) + break; + } + + write_port(port, 0, buffer, 0); + + printf("file reader finished\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ + fd = open((argc > 1) ? argv[1] : FILENAME, O_RDONLY); + if (fd < 0) + return -1; + + lseek(fd, 44, SEEK_SET); // skip wav header + + new BApplication("application/x-vnd.playfile"); + finished = create_sem(0, "finish wait"); + port = create_port(64, "buffer"); + + media_raw_audio_format format; + format = media_raw_audio_format::wildcard; + format.frame_rate = 44100; + format.channel_count = 2; + format.format = media_raw_audio_format::B_AUDIO_SHORT; + format.byte_order = B_MEDIA_LITTLE_ENDIAN; + format.buffer_size = 2048; + + printf("spawning reader thread...\n"); + + resume_thread(spawn_thread(filereader, "filereader", 8, 0)); + + snooze(1000000); + + printf("playing soundfile...\n"); + + sp = new NAMESPACE BSoundPlayer(&format, "sound player test", PlayBuffer); + + sp->SetHasData(true); + sp->Start(); + + sp->SetVolume(1.0f); + + // wait for playback end + acquire_sem(finished); + + printf("\nplayback finished\n"); + + delete sp; + + close(fd); +}