| # 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... | |