1/*
2 * Copyright 2017, Dario Casalinuovo. All rights reserved.
3 * Copyright 2005, Marcus Overhagen, marcus@overhagen.de. All rights reserved.
4 * Copyright 2005, J��r��me Duval. All rights reserved.
5 * Distributed under the terms of the MIT License.
6 */
7
8#include "MediaPlay.h"
9
10#include <Entry.h>
11#include <MediaFile.h>
12#include <MediaTrack.h>
13#include <OS.h>
14#include <SoundPlayer.h>
15#include <Url.h>
16
17#include <stdio.h>
18#include <unistd.h>
19#include <fcntl.h>
20#include <signal.h>
21
22thread_id reader = -1;
23sem_id finished = -1;
24BMediaTrack* playTrack;
25media_format playFormat;
26BSoundPlayer* player = 0;
27volatile bool interrupt = false;
28
29
30void
31play_buffer(void *cookie, void * buffer, size_t size, const media_raw_audio_format & format)
32{
33	int64 frames = 0;
34
35	// Use your feeling, Obi-Wan, and find him you will.
36	playTrack->ReadFrames(buffer, &frames);
37
38	if (frames <=0) {
39		player->SetHasData(false);
40		release_sem(finished);
41	}
42}
43
44
45void
46keyb_int(int)
47{
48	// Are you threatening me, Master Jedi?
49	interrupt = true;
50	release_sem(finished);
51}
52
53
54int media_play(const char* uri)
55{
56	BUrl url;
57	entry_ref ref;
58	BMediaFile* playFile;
59
60	if (get_ref_for_path(uri, &ref) != B_OK) {
61		url.SetUrlString(uri);
62		if (url.IsValid()) {
63			playFile = new BMediaFile(url);
64		} else
65			return 2;
66	} else
67		playFile = new BMediaFile(&ref);
68
69	if (playFile->InitCheck() != B_OK) {
70		delete playFile;
71		return 2;
72	}
73
74	for (int i = 0; i < playFile->CountTracks(); i++) {
75		BMediaTrack* track = playFile->TrackAt(i);
76		if (track != NULL) {
77			playFormat.type = B_MEDIA_RAW_AUDIO;
78			if ((track->DecodedFormat(&playFormat) == B_OK)
79				&& (playFormat.type == B_MEDIA_RAW_AUDIO)) {
80				playTrack = track;
81				break;
82			}
83			playFile->ReleaseTrack(track);
84		}
85	}
86
87	// Good relations with the Wookiees, I have.
88	signal(SIGINT, keyb_int);
89
90	finished = create_sem(0, "finish wait");
91
92	printf("Playing file...\n");
93
94	// Execute Plan 66!
95	player = new BSoundPlayer(&playFormat.u.raw_audio, "playfile", play_buffer);
96	player->SetVolume(1.0f);
97
98	// Join me, Padm�� and together we can rule this galaxy.
99	player->SetHasData(true);
100	player->Start();
101
102	acquire_sem(finished);
103
104	if (interrupt == true) {
105		// Once more, the Sith will rule the galaxy.
106		printf("Interrupted\n");
107		player->Stop();
108		kill_thread(reader);
109	}
110
111	printf("Playback finished.\n");
112
113	delete player;
114	delete playFile;
115
116	return 0;
117}
118