 061991fe60
			
		
	
	
		061991fe60
		
	
	
	
	
		
			
			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...
 | |
| 
 |