435 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			435 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								# Here are some some emails I exchanged with a guy trying to use 
							 | 
						||
| 
								 | 
							
								# libsndfile version 1 with code from the book "Linux Games Programming"
							 | 
						||
| 
								 | 
							
								# by John Hall. The email addresses have been changed to foil the spam
							 | 
						||
| 
								 | 
							
								# bots.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Date: Tue, 20 Jul 2004 22:49:21 +0100
							 | 
						||
| 
								 | 
							
								From: Paul <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								To: erikd@fake-domain-name.com
							 | 
						||
| 
								 | 
							
								Subject: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								Date: Tue, 20 Jul 2004 22:49:21 +0100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Hi,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I'm trying to get the source examples in the "Programming Linux Games" 
							 | 
						||
| 
								 | 
							
								(NoStarch, Loki Software + John R. Hall) which use sndfile.h/libsndfile.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								While I can guess some of the newer versions of function calls and 
							 | 
						||
| 
								 | 
							
								enumerations, there are some which I cannot guess.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Would you be able to translate them to the current version of 
							 | 
						||
| 
								 | 
							
								enumeration and function calls so that I can update the source?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These are the three currently failing me:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename,SFM_READ, &sfinfo))
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW)
							 | 
						||
| 
								 | 
							
								    SF_INFO.pcmbitwidth (guess: no idea!)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								There are probably more. I'm happy to send you the source files for 
							 | 
						||
| 
								 | 
							
								sound calls, scan the pages or anything else. Failing that, is there 
							 | 
						||
| 
								 | 
							
								somewhere with the changes listed so I can try and fix the code for myself?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Thanks
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TTFN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Paul
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								================================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Date: Wed, 21 Jul 2004 17:38:08 +1000
							 | 
						||
| 
								 | 
							
								From: Erik de Castro Lopo <erikd@fake-domain-name.com>
							 | 
						||
| 
								 | 
							
								To: Paul <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								Subject: Re: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								On Tue, 20 Jul 2004 22:49:21 +0100
							 | 
						||
| 
								 | 
							
								Paul <paul@fake-domain-name.co.uk> wrote:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Hi,
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> I'm trying to get the source examples in the "Programming Linux Games" 
							 | 
						||
| 
								 | 
							
								> (NoStarch, Loki Software + John R. Hall) which use sndfile.h/libsndfile.
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> While I can guess some of the newer versions of function calls and 
							 | 
						||
| 
								 | 
							
								> enumerations, there are some which I cannot guess.
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> Would you be able to translate them to the current version of 
							 | 
						||
| 
								 | 
							
								> enumeration and function calls so that I can update the source?
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> These are the three currently failing me:
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename, 
							 | 
						||
| 
								 | 
							
								> SFM_READ, &sfinfo))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								yes.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Actually this list:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM_U8
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM_S8
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM_16
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM_24
							 | 
						||
| 
								 | 
							
								    SF_FORMAT_PCM_32
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> SF_INFO.pcmbitwidth (guess: no idea!)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								WIth the above change, pcmbitwidth becomes redundant.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> There are probably more. I'm happy to send you the source files for 
							 | 
						||
| 
								 | 
							
								> sound calls, scan the pages or anything else. Failing that, is there 
							 | 
						||
| 
								 | 
							
								> somewhere with the changes listed so I can try and fix the code for
							 | 
						||
| 
								 | 
							
								> myself?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Version 1.0.0 came out some time ago, but I think this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    http://www.mega-nerd.com/libsndfile/version-1.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								lists most of the changes. You should also look at the API docs:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    http://www.mega-nerd.com/libsndfile/api.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HTH,
							 | 
						||
| 
								 | 
							
								Erik
							 | 
						||
| 
								 | 
							
								-- 
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								  Erik de Castro Lopo      nospam@fake-domain-name.com
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								"There is no reason why anyone would want a computer in their home"
							 | 
						||
| 
								 | 
							
								Ken Olson, DEC, 1977
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								================================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								From: PFJ <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								To: Erik de Castro Lopo <erikd@fake-domain-name.com>
							 | 
						||
| 
								 | 
							
								Subject: Re: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								Date: Wed, 21 Jul 2004 09:07:39 +0100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Hi Erik,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Thanks for getting back to me.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> > sf_open_read(filename, SF_INFO *sfinfo) (guess: sf_open(filename, SFM_READ, &sfinfo))
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								> yes.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Yay!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> > SF_FORMAT_PCM (guess: either SF_FORMAT_PCM_U8 or _RAW)
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								> Actually this list:
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								>     SF_FORMAT_PCM_U8
							 | 
						||
| 
								 | 
							
								>     SF_FORMAT_PCM_S8
							 | 
						||
| 
								 | 
							
								>     SF_FORMAT_PCM_16
							 | 
						||
| 
								 | 
							
								>     SF_FORMAT_PCM_24
							 | 
						||
| 
								 | 
							
								>     SF_FORMAT_PCM_32
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I know, but the source code explicitly has SF_FORMAT_PCM which given the
							 | 
						||
| 
								 | 
							
								code afterwards would equate to one of the above, but given that PCM
							 | 
						||
| 
								 | 
							
								files can have a varied bitwidth the author probably wanted to cover all
							 | 
						||
| 
								 | 
							
								bases.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Version 1.0.0 came out some time ago, but I think this:
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								>     http://www.mega-nerd.com/libsndfile/version-1.html
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								> lists most of the changes. You should also look at the API docs:
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								>     http://www.mega-nerd.com/libsndfile/api.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I'll download them and see what I can gleen.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Thanks again for getting back to me
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TTFN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Paul
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								================================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Date: Wed, 21 Jul 2004 18:20:29 +1000
							 | 
						||
| 
								 | 
							
								From: Erik de Castro Lopo <erikd@fake-domain-name.com>
							 | 
						||
| 
								 | 
							
								To: PFJ <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								Subject: Re: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								On Wed, 21 Jul 2004 09:07:39 +0100
							 | 
						||
| 
								 | 
							
								PFJ <paul@fake-domain-name.co.uk> wrote:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> I know, but the source code explicitly has SF_FORMAT_PCM which given the
							 | 
						||
| 
								 | 
							
								> code afterwards would equate to one of the above, but given that PCM
							 | 
						||
| 
								 | 
							
								> files can have a varied bitwidth the author probably wanted to cover all
							 | 
						||
| 
								 | 
							
								> bases.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								But surely the existing code does something like:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM;
							 | 
						||
| 
								 | 
							
								    sfinfo.pcmbitwidth = 16;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								which can be directly translated to:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								and the same for pcmbitwitdhs of 24 and 32. For pcmbitwidth of 8
							 | 
						||
| 
								 | 
							
								you need to know that WAV files use SF_FORMAT_PCM_U8 and AIFF
							 | 
						||
| 
								 | 
							
								files use SF_FORMAT_PCM_S8. That's all there is to it.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Erik
							 | 
						||
| 
								 | 
							
								-- 
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								  Erik de Castro Lopo      nospam@fake-domain-name.com
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								"Python addresses true pseudocode's two major failings: that it
							 | 
						||
| 
								 | 
							
								isn't standardized, and it isn't executable."
							 | 
						||
| 
								 | 
							
								- Grant R. Griffin  in comp.dsp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								================================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Subject: Re: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								From: PFJ <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								To: Erik de Castro Lopo <erikd@fake-domain-name.com>
							 | 
						||
| 
								 | 
							
								Date: Wed, 21 Jul 2004 09:50:55 +0100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Hi Erik,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> > I know, but the source code explicitly has SF_FORMAT_PCM which given the
							 | 
						||
| 
								 | 
							
								> > code afterwards would equate to one of the above, but given that PCM
							 | 
						||
| 
								 | 
							
								> > files can have a varied bitwidth the author probably wanted to cover all
							 | 
						||
| 
								 | 
							
								> > bases.
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								> But surely the existing code does something like:
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								>     sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM;
							 | 
						||
| 
								 | 
							
								>     sfinfo.pcmbitwidth = 16;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If only!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The actual code is this
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int LoadSoundFile(char *filename, sound_p sound)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    SNDFILE *file;
							 | 
						||
| 
								 | 
							
								    SF_INFO file_info;
							 | 
						||
| 
								 | 
							
								    short *buffer_short = NULL;
							 | 
						||
| 
								 | 
							
								    u_int8_t *buffer_8 = NULL;
							 | 
						||
| 
								 | 
							
								    int16_t *buffer_16 = NULL;
							 | 
						||
| 
								 | 
							
								    unsigned int i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Open the file and retrieve sample information. */
							 | 
						||
| 
								 | 
							
								    file = sf_open_read(filename, &file_info);
							 | 
						||
| 
								 | 
							
								    // I've sorted this one already - PFJ
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Make sure the format is acceptable. */
							 | 
						||
| 
								 | 
							
								    if ((file_info.format & 0x0F) != SF_FORMAT_PCM) {
							 | 
						||
| 
								 | 
							
										printf("'%s' is not a PCM-based audio file.\n", filename);
							 | 
						||
| 
								 | 
							
										sf_close(file);
							 | 
						||
| 
								 | 
							
										return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ((file_info.pcmbitwidth == 8) && (file_info.channels == 1)) {
							 | 
						||
| 
								 | 
							
										sound->format = AL_FORMAT_MONO8;
							 | 
						||
| 
								 | 
							
								    } else if ((file_info.pcmbitwidth == 8) && (file_info.channels == 2)) {
							 | 
						||
| 
								 | 
							
										sound->format = AL_FORMAT_STEREO8;
							 | 
						||
| 
								 | 
							
								    } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 1)) {
							 | 
						||
| 
								 | 
							
										sound->format = AL_FORMAT_MONO16;
							 | 
						||
| 
								 | 
							
								    } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 2)) {
							 | 
						||
| 
								 | 
							
										sound->format = AL_FORMAT_STEREO16;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
										printf("Unknown sample format in %s.\n", filename);
							 | 
						||
| 
								 | 
							
										sf_close(file);
							 | 
						||
| 
								 | 
							
										return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Allocate buffers. */
							 | 
						||
| 
								 | 
							
								    buffer_short = (short *)malloc(file_info.samples * file_info.channels * sizeof (short));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buffer_8 = (u_int8_t *)malloc(file_info.samples * file_info.channels * file_info.pcmbitwidth / 8);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buffer_16 = (int16_t *)buffer_8;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (buffer_short == NULL || buffer_8 == NULL) {
							 | 
						||
| 
								 | 
							
										printf("Unable to allocate enough memory for '%s'.\n", filename);
							 | 
						||
| 
								 | 
							
										goto error_cleanup;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Read the entire sound file. */
							 | 
						||
| 
								 | 
							
								    if (sf_readf_short(file,buffer_short,file_info.samples) == (size_t)-1) {
							 | 
						||
| 
								 | 
							
										printf("Error while reading samples from '%s'.\n", filename);
							 | 
						||
| 
								 | 
							
										goto error_cleanup;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<minor snip>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Fill in the sound data structure. */
							 | 
						||
| 
								 | 
							
								    sound->freq = file_info.samplerate;
							 | 
						||
| 
								 | 
							
								    sound->size = file_info.samples * file_info.channels * file_info.pcmbitwidth / 8;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Give our sound data to OpenAL. */
							 | 
						||
| 
								 | 
							
								    alGenBuffers(1, &sound->name);
							 | 
						||
| 
								 | 
							
								    if (alGetError() != AL_NO_ERROR) {
							 | 
						||
| 
								 | 
							
										printf("Error creating an AL buffer name for %s.\n", filename);
							 | 
						||
| 
								 | 
							
										goto error_cleanup;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    alBufferData(sound->name, sound->format, buffer_8, sound->size,sound->freq);
							 | 
						||
| 
								 | 
							
								    if (alGetError() != AL_NO_ERROR) {
							 | 
						||
| 
								 | 
							
										printf("Error sending buffer data to OpenAL for %s.\n", filename);
							 | 
						||
| 
								 | 
							
										goto error_cleanup;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Close the file and return success. */
							 | 
						||
| 
								 | 
							
								    sf_close(file);
							 | 
						||
| 
								 | 
							
								    free(buffer_short);
							 | 
						||
| 
								 | 
							
								    free(buffer_8);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 error_cleanup:
							 | 
						||
| 
								 | 
							
								    if (file != NULL) fclose(file);
							 | 
						||
| 
								 | 
							
								    free(buffer_short);
							 | 
						||
| 
								 | 
							
								    free(buffer_8);
							 | 
						||
| 
								 | 
							
								    return -1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As you can see, the PCM material in the listing will not currently
							 | 
						||
| 
								 | 
							
								compile and for the other sndfile material, it probably won't either.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Any help would be appreciated.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TTFN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Paul
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								================================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								From: Erik de Castro Lopo <erikd@fake-domain-name.com>
							 | 
						||
| 
								 | 
							
								To: PFJ <paul@fake-domain-name.co.uk>
							 | 
						||
| 
								 | 
							
								Subject: Re: Can you help with a problem?
							 | 
						||
| 
								 | 
							
								Date: Wed, 21 Jul 2004 19:36:46 +1000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								On Wed, 21 Jul 2004 09:50:55 +0100
							 | 
						||
| 
								 | 
							
								PFJ <paul@fake-domain-name.co.uk> wrote:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Hi Erik,
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> > > I know, but the source code explicitly has SF_FORMAT_PCM which given the
							 | 
						||
| 
								 | 
							
								> > > code afterwards would equate to one of the above, but given that PCM
							 | 
						||
| 
								 | 
							
								> > > files can have a varied bitwidth the author probably wanted to cover all
							 | 
						||
| 
								 | 
							
								> > > bases.
							 | 
						||
| 
								 | 
							
								> > 
							 | 
						||
| 
								 | 
							
								> > But surely the existing code does something like:
							 | 
						||
| 
								 | 
							
								> > 
							 | 
						||
| 
								 | 
							
								> >     sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM;
							 | 
						||
| 
								 | 
							
								> >     sfinfo.pcmbitwidth = 16;
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								> If only!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								No, really.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Drop this completely:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								>     /* Make sure the format is acceptable. */
							 | 
						||
| 
								 | 
							
								>     if ((file_info.format & 0x0F) != SF_FORMAT_PCM) {
							 | 
						||
| 
								 | 
							
								> 	printf("'%s' is not a PCM-based audio file.\n", filename);
							 | 
						||
| 
								 | 
							
								> 	sf_close(file);
							 | 
						||
| 
								 | 
							
								> 	return -1;
							 | 
						||
| 
								 | 
							
								>     }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Replace this block:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								>     if ((file_info.pcmbitwidth == 8) && (file_info.channels == 1)) {
							 | 
						||
| 
								 | 
							
								> 	        sound->format = AL_FORMAT_MONO8;
							 | 
						||
| 
								 | 
							
								>     } else if ((file_info.pcmbitwidth == 8) && (file_info.channels == 2)) {
							 | 
						||
| 
								 | 
							
								>           sound->format = AL_FORMAT_STEREO8;
							 | 
						||
| 
								 | 
							
								>     } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 1)) {
							 | 
						||
| 
								 | 
							
								>           sound->format = AL_FORMAT_MONO16;
							 | 
						||
| 
								 | 
							
								>     } else if ((file_info.pcmbitwidth == 16) && (file_info.channels == 2)) {
							 | 
						||
| 
								 | 
							
								>           sound->format = AL_FORMAT_STEREO16;
							 | 
						||
| 
								 | 
							
								>     } else {
							 | 
						||
| 
								 | 
							
								>           printf("Unknown sample format in %s.\n", filename);
							 | 
						||
| 
								 | 
							
								>           sf_close(file);
							 | 
						||
| 
								 | 
							
								>           return -1;
							 | 
						||
| 
								 | 
							
								>     }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								with:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    int pcmbitwidth = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (file_info.format & SF_FORMAT_SUBMASK != SF_FORMAT_PCM_16)
							 | 
						||
| 
								 | 
							
								    { 	printf("'%s' is not a PCM-based audio file.\n", filename);
							 | 
						||
| 
								 | 
							
								        sf_close(file);
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (file_info.channels < 1 || file_info.channels > 2)
							 | 
						||
| 
								 | 
							
								    { 	printf("'%s' bad channel count.\n", filename);
							 | 
						||
| 
								 | 
							
								        sf_close(file);
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    switch (file_info.format & SF_FORMAT_SUBMASK + file_info.channels << 16)
							 | 
						||
| 
								 | 
							
								    {    case (SF_FORMAT_PCM_U8 + 1 << 16):
							 | 
						||
| 
								 | 
							
								             sound->format = AL_FORMAT_MONO8;
							 | 
						||
| 
								 | 
							
								             pcmbitwidth = 8;
							 | 
						||
| 
								 | 
							
								             break;
							 | 
						||
| 
								 | 
							
								         case (SF_FORMAT_PCM_U8 + 2 << 16):
							 | 
						||
| 
								 | 
							
								             sound->format = AL_FORMAT_STEREO8;
							 | 
						||
| 
								 | 
							
								             pcmbitwidth = 8;
							 | 
						||
| 
								 | 
							
								             break;
							 | 
						||
| 
								 | 
							
								         case (SF_FORMAT_PCM_16 + 1 << 16):
							 | 
						||
| 
								 | 
							
								             sound->format = AL_FORMAT_MONO16;
							 | 
						||
| 
								 | 
							
								             pcmbitwidth = 16;
							 | 
						||
| 
								 | 
							
								             break;
							 | 
						||
| 
								 | 
							
								         case (SF_FORMAT_PCM_16 + 2 << 16):
							 | 
						||
| 
								 | 
							
								             sound->format = AL_FORMAT_STEREO16;
							 | 
						||
| 
								 | 
							
								             pcmbitwidth = 16;
							 | 
						||
| 
								 | 
							
								             break;
							 | 
						||
| 
								 | 
							
								         default:
							 | 
						||
| 
								 | 
							
								             printf("Unknown sample format in %s.\n", filename);
							 | 
						||
| 
								 | 
							
								             sf_close(file);
							 | 
						||
| 
								 | 
							
								             return -1;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								>     /* Allocate buffers. */
							 | 
						||
| 
								 | 
							
								>     buffer_short = (short *)malloc(file_info.samples *
							 | 
						||
| 
								 | 
							
								> 				   file_info.channels * 
							 | 
						||
| 
								 | 
							
								> 				   sizeof (short));
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								>     buffer_8 = (u_int8_t *)malloc(file_info.samples *
							 | 
						||
| 
								 | 
							
								> 				  file_info.channels *
							 | 
						||
| 
								 | 
							
								> 				  file_info.pcmbitwidth / 8);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Use pcmbitwidth as calculated above.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								>     buffer_16 = (int16_t *)buffer_8;
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								>     if (buffer_short == NULL || buffer_8 == NULL) {
							 | 
						||
| 
								 | 
							
								> 	printf("Unable to allocate enough memory for '%s'.\n", filename);
							 | 
						||
| 
								 | 
							
								> 	goto error_cleanup;
							 | 
						||
| 
								 | 
							
								>     }
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								>     /* Read the entire sound file. */
							 | 
						||
| 
								 | 
							
								>     if (sf_readf_short(file,buffer_short,file_info.samples) == (size_t)- 1) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Replace "(size_t) - 1" with " < 0".
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> As you can see, the PCM material in the listing will not currently
							 | 
						||
| 
								 | 
							
								> compile and for the other sndfile material, it probably won't either.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								None of the changes above should have been very difficult to figure
							 | 
						||
| 
								 | 
							
								out.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Erik
							 | 
						||
| 
								 | 
							
								-- 
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								  Erik de Castro Lopo      nospam@fake-domain-name.com
							 | 
						||
| 
								 | 
							
								+-----------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								Microsoft is finally bringing all of its Windows operating system families
							 | 
						||
| 
								 | 
							
								under one roof. It will combine all of the features of CE, stability and
							 | 
						||
| 
								 | 
							
								support of ME and the speed of NT.
							 | 
						||
| 
								 | 
							
								It will be called Windows CEMENT...
							 | 
						||
| 
								 | 
							
								
							 |