MediaClient: Add play and test options

This commit is contained in:
Dario Casalinuovo 2017-04-28 02:03:02 +02:00
parent a33c8f4c2a
commit ada4f9788f
6 changed files with 308 additions and 118 deletions

View File

@ -6,5 +6,7 @@ UsePrivateHeaders [ FDirName media experimental ] ;
SimpleTest media_client :
media_client.cpp
MediaPlay.cpp
MediaTest.cpp
: libmedia.so be root [ TargetLibsupc++ ]
;

View File

@ -0,0 +1,114 @@
/*
* Copyright 2017, Dario Casalinuovo. All rights reserved.
* Copyright 2005, Marcus Overhagen, marcus@overhagen.de. All rights reserved.
* Copyright 2005, Jérôme Duval. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "MediaPlay.h"
#include <Entry.h>
#include <MediaFile.h>
#include <MediaTrack.h>
#include <OS.h>
#include <SoundPlayer.h>
#include <Url.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
thread_id reader = -1;
sem_id finished = -1;
BMediaTrack* playTrack;
media_format playFormat;
BSoundPlayer* player = 0;
volatile bool interrupt = false;
void
play_buffer(void *cookie, void * buffer, size_t size, const media_raw_audio_format & format)
{
int64 frames = 0;
// Use your feeling, Obi-Wan, and find him you will.
playTrack->ReadFrames(buffer, &frames);
if (frames <=0) {
player->SetHasData(false);
release_sem(finished);
}
}
void
keyb_int(int)
{
// Are you threatening me, Master Jedi?
interrupt = true;
release_sem(finished);
}
int media_play(const char* uri)
{
BUrl url;
entry_ref ref;
BMediaFile* playFile;
if (get_ref_for_path(uri, &ref) != B_OK) {
url.SetUrlString(uri);
if (url.IsValid()) {
playFile = new BMediaFile(url);
} else
return 2;
} else
playFile = new BMediaFile(&ref);
if (playFile->InitCheck() != B_OK) {
delete playFile;
return 2;
}
for (int i = 0; i < playFile->CountTracks(); i++) {
BMediaTrack* track = playFile->TrackAt(i);
playFormat.type = B_MEDIA_RAW_AUDIO;
if ((track->DecodedFormat(&playFormat) == B_OK)
&& (playFormat.type == B_MEDIA_RAW_AUDIO)) {
playTrack = track;
break;
}
if (track)
playFile->ReleaseTrack(track);
}
// Good relations with the Wookiees, I have.
signal(SIGINT, keyb_int);
finished = create_sem(0, "finish wait");
printf("Playing file...\n");
// Execute Plan 66!
player = new BSoundPlayer(&playFormat.u.raw_audio, "playfile", play_buffer);
player->SetVolume(1.0f);
// Join me, Padmé and together we can rule this galaxy.
player->SetHasData(true);
player->Start();
acquire_sem(finished);
if (interrupt == true) {
// Once more, the Sith will rule the galaxy.
printf("Interrupted\n");
player->Stop();
kill_thread(reader);
}
printf("Playback finished.\n");
delete player;
delete playFile;
}

View File

@ -0,0 +1,12 @@
/*
* Copyright 2017, Dario Casalinuovo. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _MEDIA_CLIENT_PLAY
#define _MEDIA_CLIENT_PLAY
int media_play(const char* uri);
#endif

View File

@ -0,0 +1,140 @@
/*
* Copyright 2017, Dario Casalinuovo. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "MediaTest.h"
#include <SimpleMediaClient.h>
#include <MediaConnection.h>
#include <SupportDefs.h>
#include <assert.h>
#include <stdio.h>
#include <debug.h>
#ifdef DEBUG
#define DELAYED_MODE 1
#define SNOOZE_FOR 10000000
#endif
static BSimpleMediaClient* sProducer = NULL;
static BSimpleMediaClient* sConsumer = NULL;
static BSimpleMediaClient* sFilter = NULL;
void
_InitClients(bool hasFilter)
{
sProducer = new BSimpleMediaClient("MediaClientProducer");
sConsumer = new BSimpleMediaClient("MediaClientConsumer");
if (hasFilter)
sFilter = new BSimpleMediaClient("MediaClientFilter");
else
sFilter = NULL;
}
void
_DeleteClients()
{
delete sProducer;
delete sConsumer;
delete sFilter;
}
media_format
_BuildRawAudioFormat()
{
media_format format;
format.type = B_MEDIA_RAW_AUDIO;
format.u.raw_audio = media_multi_audio_format::wildcard;
return format;
}
void
_ConsumerProducerTest()
{
_InitClients(false);
BSimpleMediaOutput* output = sProducer->BeginOutput();
BSimpleMediaInput* input = sConsumer->BeginInput();
output->SetAcceptedFormat(_BuildRawAudioFormat());
input->SetAcceptedFormat(_BuildRawAudioFormat());
assert(sConsumer->Connect(input, output) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sConsumer->Disconnect() == B_OK);
_DeleteClients();
}
void
_ProducerConsumerTest()
{
_InitClients(false);
BMediaOutput* output = sProducer->BeginOutput();
BMediaInput* input = sConsumer->BeginInput();
assert(sProducer->Connect(output, input) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sProducer->Disconnect() == B_OK);
_DeleteClients();
}
void
_ProducerFilterConsumerTest()
{
_InitClients(true);
BMediaOutput* output = sProducer->BeginOutput();
BMediaInput* input = sConsumer->BeginInput();
BMediaInput* filterInput = sFilter->BeginInput();
BMediaOutput* filterOutput = sFilter->BeginOutput();
assert(sFilter->Bind(filterInput, filterOutput) == B_OK);
assert(sProducer->Connect(output, filterInput) == B_OK);
assert(sFilter->Connect(filterOutput, input) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sFilter->Disconnect() == B_OK);
_DeleteClients();
}
void
media_test()
{
printf("Testing Simple (1:1) Producer-Consumer configuration: ");
_ConsumerProducerTest();
_ProducerConsumerTest();
printf("OK\n");
printf("Testing Simple (1:1:1) Producer-Filter-Consumer configuration: ");
_ProducerFilterConsumerTest();
printf("OK\n");
}

View File

@ -0,0 +1,12 @@
/*
* Copyright 2017, Dario Casalinuovo. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _MEDIA_CLIENT_TEST
#define _MEDIA_CLIENT_TEST
void media_test();
#endif

View File

@ -1,133 +1,43 @@
/*
* Copyright 2016, Dario Casalinuovo. All rights reserved.
* Copyright 2016-2017, Dario Casalinuovo. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <SimpleMediaClient.h>
#include <MediaConnection.h>
#include <SupportDefs.h>
#include <Application.h>
#include <debug.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#ifdef DEBUG
#define DELAYED_MODE 1
#define SNOOZE_FOR 10000000
#endif
#include "MediaPlay.h"
#include "MediaTest.h"
static BSimpleMediaClient* sProducer = NULL;
static BSimpleMediaClient* sConsumer = NULL;
static BSimpleMediaClient* sFilter = NULL;
void _InitClients(bool hasFilter)
void print_usage()
{
sProducer = new BSimpleMediaClient("MediaClientProducer");
sConsumer = new BSimpleMediaClient("MediaClientConsumer");
if (hasFilter)
sFilter = new BSimpleMediaClient("MediaClientFilter");
else
sFilter = NULL;
printf("Usage:\n");
printf(" media_client play <uri>\n");
printf(" media_client test\n");
}
void _DeleteClients()
int main(int argc, char *argv[])
{
delete sProducer;
delete sConsumer;
delete sFilter;
}
media_format _BuildRawAudioFormat()
{
media_format format;
format.type = B_MEDIA_RAW_AUDIO;
format.u.raw_audio = media_multi_audio_format::wildcard;
return format;
}
void _ConsumerProducerTest()
{
_InitClients(false);
BSimpleMediaOutput* output = sProducer->BeginOutput();
BSimpleMediaInput* input = sConsumer->BeginInput();
output->SetAcceptedFormat(_BuildRawAudioFormat());
input->SetAcceptedFormat(_BuildRawAudioFormat());
assert(sConsumer->Connect(input, output) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sConsumer->Disconnect() == B_OK);
_DeleteClients();
}
void _ProducerConsumerTest()
{
_InitClients(false);
BMediaOutput* output = sProducer->BeginOutput();
BMediaInput* input = sConsumer->BeginInput();
assert(sProducer->Connect(output, input) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sProducer->Disconnect() == B_OK);
_DeleteClients();
}
void _ProducerFilterConsumerTest()
{
_InitClients(true);
BMediaOutput* output = sProducer->BeginOutput();
BMediaInput* input = sConsumer->BeginInput();
BMediaInput* filterInput = sFilter->BeginInput();
BMediaOutput* filterOutput = sFilter->BeginOutput();
assert(sFilter->Bind(filterInput, filterOutput) == B_OK);
assert(sProducer->Connect(output, filterInput) == B_OK);
assert(sFilter->Connect(filterOutput, input) == B_OK);
#ifdef DELAYED_MODE
snooze(SNOOZE_FOR);
#endif
assert(sFilter->Disconnect() == B_OK);
_DeleteClients();
}
int main()
{
printf("Testing Simple (1:1) Producer-Consumer configuration: ");
_ConsumerProducerTest();
_ProducerConsumerTest();
printf("OK\n");
printf("Testing Simple (1:1:1) Producer-Filter-Consumer configuration: ");
_ProducerFilterConsumerTest();
printf("OK\n");
return 0;
if (argc < 2) {
print_usage();
return 0;
}
BApplication* app = new BApplication(
"application/x-vnd.Haiku-media_client");
int ret = 0;
if (strcmp(argv[1], "play") == 0) {
if (argc < 3) {
print_usage();
} else
ret = media_play(argv[2]);
} else if (strcmp(argv[1], "test") == 0)
media_test();
return ret;
}