1/*
2 * Copyright 2012, Adrien Destugues <pulkomandy@gmail.com>
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include <Entry.h>
12#include <InterfaceDefs.h>
13#include <MediaFile.h>
14#include <MediaTrack.h>
15#include <PushGameSound.h>
16
17
18int
19main(int argc, char *argv[])
20{
21	// 256 frames * 4 buffer parts * 2 channels * 2 bytes per sample
22	// will give us internal buffer of 4096 bytes
23	size_t framesPerBufferPart = 256;
24	size_t bufferPartCount = 4;
25
26	if (argc != 1 && argc != 3) {
27		printf("Usage: %s [<frames per part> <parts>]\n",
28			argv[0]);
29		return 0;
30	}
31
32	if (argc == 3) {
33		size_t size = strtoul(argv[1], NULL, 10);
34		if (size > 0)
35			framesPerBufferPart = size;
36
37		size = strtoul(argv[2], NULL,  10);
38		if (size > 0)
39			bufferPartCount = size;
40	}
41
42	printf("frames per buffer part: %ld\n", framesPerBufferPart);
43	printf("buffer part count: %ld\n", bufferPartCount);
44
45	gs_audio_format gsFormat;
46	memset(&gsFormat, 0, sizeof(gsFormat));
47	gsFormat.frame_rate = 48000;
48	gsFormat.channel_count = 1;
49	gsFormat.format = gs_audio_format::B_GS_S16;
50	gsFormat.byte_order = B_MEDIA_LITTLE_ENDIAN;
51	gsFormat.buffer_size = framesPerBufferPart;
52
53	BPushGameSound pushGameSound(framesPerBufferPart, &gsFormat,
54		bufferPartCount);
55	if (pushGameSound.InitCheck() != B_OK) {
56		printf("trouble initializing push game sound: %s\n",
57			strerror(pushGameSound.InitCheck()));
58		return 1;
59	}
60
61	uint8 *buffer;
62	size_t bufferSize;
63	if (pushGameSound.LockForCyclic((void **)&buffer, &bufferSize)
64			!= BPushGameSound::lock_ok) {
65		printf("cannot lock buffer\n");
66		return 1;
67	}
68	memset(buffer, 0, bufferSize);
69
70	if (pushGameSound.StartPlaying() != B_OK) {
71		printf("cannot start playback\n");
72		return 1;
73	}
74
75	printf("playing, press [esc] to exit...\n");
76
77	key_info keyInfo;
78
79	size_t sampleCount = framesPerBufferPart * bufferPartCount;
80	for(size_t pos = 0; pos < sampleCount; pos++)
81	{
82		*(int16_t*)(buffer + pos * sizeof(int16_t))
83			= (int16_t)(2000 * sin(pos * gsFormat.frame_rate
84					/ ((float)sampleCount * 440)));
85	}
86
87	while (true) {
88		usleep(1000000 * framesPerBufferPart / gsFormat.frame_rate);
89
90		// check escape key state
91		if (get_key_info(&keyInfo) != B_OK) {
92			printf("\nkeyboard state read error\n");
93			break;
94		}
95		if ((keyInfo.key_states[0] & 0x40) != 0)
96			break;
97	}
98
99	pushGameSound.StopPlaying();
100
101	printf("\nfinished.\n");
102
103	return 0;
104}
105