annotate src/libsndfile-1.0.27/programs/sndfile-play-beos.cpp @ 127:7867fa7e1b6b

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