blob: fb3fde4cdceae8d24fd52ea090e021882f523c05 [file] [log] [blame]
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04001/*
2** Copyright (C) 2001 Marcus Overhagen <marcus@overhagen.de>
3**
4** This program is free software; you can redistribute it and/or modify
5** it under the terms of the GNU General Public License as published by
6** the Free Software Foundation; either version 2 of the License, or
7** (at your option) any later version.
8**
9** This program is distributed in the hope that it will be useful,
10** but WITHOUT ANY WARRANTY; without even the implied warranty of
11** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12** GNU General Public License for more details.
13**
14** You should have received a copy of the GNU General Public License
15** along with this program; if not, write to the Free Software
16** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*/
18
19#include <stdio.h>
20
21#include <Application.h>
22#include <SoundPlayer.h>
23#include <string.h>
24
25#include <sndfile.h>
26
27#define BUFFER_LEN 1024
28
29/*------------------------------------------------------------------------------
30** BeOS functions for playing a sound.
31*/
32
33#if defined (__BEOS__)
34
35struct shared_data
36{
37 BSoundPlayer *player;
38 SNDFILE *sndfile;
39 SF_INFO sfinfo;
40 sem_id finished;
41};
42
43static void
44buffer_callback(void *theCookie, void *buf, size_t size, const media_raw_audio_format &format)
45{
46 shared_data *data = (shared_data *)theCookie;
47 short *buffer = (short *)buf;
48 int count = size / sizeof(short);
49 int m, readcount;
50
51 if (!data->player->HasData())
52 return;
53
54 readcount = sf_read_short(data->sndfile, buffer, count);
55 if (readcount == 0)
56 { data->player->SetHasData(false);
57 release_sem(data->finished);
58 }
59 if (readcount < count)
60 { for (m = readcount ; m < count ; m++)
61 buffer [m] = 0 ;
62 }
63 if (data->sfinfo.pcmbitwidth < 16)
64 { for (m = 0 ; m < count ; m++)
65 buffer [m] *= 256 ;
66 }
67}
68
69static void
70beos_play (int argc, char *argv [])
71{
72 shared_data data;
73 status_t status;
74 int k;
75
76 /* BSoundPlayer requires a BApplication object */
77 BApplication app("application/x-vnd.MarcusOverhagen-sfplay");
78
79 for (k = 1 ; k < argc ; k++)
80 { printf ("Playing %s\n", argv [k]) ;
81 if (! (data.sndfile = sf_open_read (argv [k], &data.sfinfo)))
82 { sf_perror (NULL) ;
83 continue ;
84 } ;
85
86 if (data.sfinfo.channels < 1 || data.sfinfo.channels > 2)
87 { printf ("Error : channels = %d.\n", data.sfinfo.channels) ;
88 sf_close (data.sndfile) ;
89 continue ;
90 } ;
91
92 data.finished = create_sem(0,"finished");
93
94 media_raw_audio_format format =
95 { data.sfinfo.samplerate,
96 data.sfinfo.channels,
97 media_raw_audio_format::B_AUDIO_SHORT,
98 B_HOST_IS_LENDIAN ? B_MEDIA_LITTLE_ENDIAN : B_MEDIA_BIG_ENDIAN,
99 BUFFER_LEN * sizeof(short)
100 };
101
102 BSoundPlayer player(&format,"player",buffer_callback,NULL,&data);
103 data.player = &player;
104
105 if ((status = player.InitCheck()) != B_OK)
106 {
107 printf ("Error : BSoundPlayer init failed, %s.\n", strerror(status)) ;
108 delete_sem(data.finished);
109 sf_close (data.sndfile) ;
110 continue ;
111 }
112
113 player.SetVolume(1.0);
114 player.Start();
115 player.SetHasData(true);
116 acquire_sem(data.finished);
117 player.Stop();
118 delete_sem(data.finished);
119
120 sf_close (data.sndfile) ;
121
122 } ;
123
124} /* beos_play */
125
126#endif
127
128/*==============================================================================
129** Main function.
130*/
131
132int
133main (int argc, char *argv [])
134{
135 if (argc < 2)
136 { printf ("Usage : %s <input sound file>\n\n", argv [0]) ;
137 return 1 ;
138 } ;
139
140 beos_play (argc, argv) ;
141
142 return 0 ;
143} /* main */
144