~ubuntu-branches/debian/jessie/libsndfile/jessie

« back to all changes in this revision

Viewing changes to programs/sndfile-play-beos.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Mimram
  • Date: 2009-02-17 19:21:03 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20090217192103-7rhu1n8p79jnbzy3
Tags: 1.0.18-2
Add missing build-dependencies on pkg-config and libvorbis-dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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__)
 
34
 
 
35
struct shared_data
 
36
{
 
37
        BSoundPlayer *player;
 
38
        SNDFILE *sndfile;
 
39
        SF_INFO sfinfo; 
 
40
        sem_id finished;
 
41
};
 
42
 
 
43
static void 
 
44
buffer_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
 
 
69
static void
 
70
beos_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
 
 
132
int 
 
133
main (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