HaikuPorts
  • Login
  • Preferences
  • Help/Guide
  • Wiki
  • Timeline
  • Roadmap
  • View Tickets
  • Search
  • Port Log
  • Blog

Context Navigation

  • Back to Ticket #366

Ticket #366: sndfile-play-beos.cpp

File sndfile-play-beos.cpp, 3.4 KB (added by michaelvoliveira, 5 years ago)

updated example.. actually it play sound!

Line 
1/*
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__) || defined(__HAIKU__)
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 (readcount > count)
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 (argv [k], SFM_READ, &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               

Download in other formats:

  • Original Format

Trac Powered

Powered by Trac 0.13dev-r10686
By Edgewall Software.

Visit the Trac open source project at
http://trac.edgewall.org/