it appears a one-character typo in the cmake_minimum_required line prevents it from compiling under CMake 4.0. in order to fix that, I had to take this thing out of submodules... it is recommended to do this after you pull; git submodule deinit extern/libsndfile
		
			
				
	
	
		
			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...
 | 
						|
 |