aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-03-24 13:36:49 -0700
committerChris Robinson <[email protected]>2020-03-24 13:36:49 -0700
commit586bc94d513125a63e61922ac0805a71c6ef1950 (patch)
treee16d776e93f9912dd03e720dcd3617b783a0791f
parentc24d1272290313243738b646688eac2d68971be3 (diff)
Use libsndfile for the alplay example
-rw-r--r--CMakeLists.txt24
-rw-r--r--cmake/FindSndFile.cmake23
-rw-r--r--examples/alplay.c94
3 files changed, 82 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a8d6a97..8fc2002f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1137,6 +1137,7 @@ IF(ALSOFT_EXAMPLES)
ENDIF()
IF(SDL2_FOUND)
FIND_PACKAGE(SDL_sound)
+ FIND_PACKAGE(SndFile)
FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
ENDIF()
ENDIF()
@@ -1478,14 +1479,23 @@ IF(ALSOFT_EXAMPLES)
MESSAGE(STATUS "Building example programs")
+ IF(SNDFILE_FOUND)
+ ADD_EXECUTABLE(alplay examples/alplay.c)
+ TARGET_INCLUDE_DIRECTORIES(alplay PRIVATE ${SNDFILE_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(alplay PRIVATE ${LINKER_FLAGS} ${SNDFILE_LIBRARIES} ex-common)
+
+ IF(ALSOFT_INSTALL)
+ INSTALL(TARGETS alplay
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ ENDIF()
+
+ MESSAGE(STATUS "Building SndFile example programs")
+ ENDIF()
+
IF(SDL2_FOUND)
IF(SDL_SOUND_FOUND)
- ADD_EXECUTABLE(alplay examples/alplay.c)
- TARGET_INCLUDE_DIRECTORIES(alplay
- PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
- TARGET_LINK_LIBRARIES(alplay
- PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common)
-
ADD_EXECUTABLE(alstream examples/alstream.c)
TARGET_INCLUDE_DIRECTORIES(alstream
PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
@@ -1530,7 +1540,7 @@ IF(ALSOFT_EXAMPLES)
PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common ${MATH_LIB})
IF(ALSOFT_INSTALL)
- INSTALL(TARGETS alplay alstream alreverb almultireverb allatency alloopback alhrtf
+ INSTALL(TARGETS alstream alreverb almultireverb allatency alloopback alhrtf
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/cmake/FindSndFile.cmake b/cmake/FindSndFile.cmake
new file mode 100644
index 00000000..afeec961
--- /dev/null
+++ b/cmake/FindSndFile.cmake
@@ -0,0 +1,23 @@
+# - Try to find SndFile
+# Once done this will define
+#
+# SNDFILE_FOUND - system has SndFile
+# SNDFILE_INCLUDE_DIRS - the SndFile include directory
+# SNDFILE_LIBRARIES - Link these to use SndFile
+
+find_path(SNDFILE_INCLUDE_DIR NAMES sndfile.h)
+
+find_library(SNDFILE_LIBRARY NAMES sndfile sndfile-1)
+
+# handle the QUIETLY and REQUIRED arguments and set SNDFILE_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(SndFile DEFAULT_MSG SNDFILE_LIBRARY SNDFILE_INCLUDE_DIR)
+
+if(SNDFILE_FOUND)
+ set(SNDFILE_INCLUDE_DIRS ${SNDFILE_INCLUDE_DIR})
+ set(SNDFILE_LIBRARIES ${SNDFILE_LIBRARY})
+endif()
+
+# show the SNDFILE_INCLUDE_DIR and SNDFILE_LIBRARY variables only in the advanced view
+mark_as_advanced(SNDFILE_INCLUDE_DIR SNDFILE_LIBRARY)
diff --git a/examples/alplay.c b/examples/alplay.c
index 09ad96b4..af1c313c 100644
--- a/examples/alplay.c
+++ b/examples/alplay.c
@@ -24,12 +24,13 @@
/* This file contains an example for playing a sound buffer. */
-#include <stdio.h>
#include <assert.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
-#include "SDL_sound.h"
-#include "SDL_audio.h"
-#include "SDL_stdinc.h"
+#include "sndfile.h"
#include "AL/al.h"
@@ -41,68 +42,62 @@
*/
static ALuint LoadSound(const char *filename)
{
- Sound_Sample *sample;
ALenum err, format;
ALuint buffer;
- Uint32 slen;
-
- /* Open the audio file */
- sample = Sound_NewSampleFromFile(filename, NULL, 65536);
- if(!sample)
+ SNDFILE *sndfile;
+ SF_INFO sfinfo;
+ short *membuf;
+ sf_count_t num_frames;
+ ALsizei num_bytes;
+
+ /* Open the audio file and check that it's usable. */
+ sndfile = sf_open(filename, SFM_READ, &sfinfo);
+ if(!sndfile)
{
- fprintf(stderr, "Could not open audio in %s\n", filename);
+ fprintf(stderr, "Could not open audio in %s: %s\n", filename, sf_strerror(sndfile));
return 0;
}
-
- /* Get the sound format, and figure out the OpenAL format */
- if(sample->actual.channels == 1)
- {
- if(sample->actual.format == AUDIO_U8)
- format = AL_FORMAT_MONO8;
- else if(sample->actual.format == AUDIO_S16SYS)
- format = AL_FORMAT_MONO16;
- else
- {
- fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format);
- Sound_FreeSample(sample);
- return 0;
- }
- }
- else if(sample->actual.channels == 2)
+ if(sfinfo.frames < 1 || sfinfo.frames > (sf_count_t)(INT_MAX/sizeof(short))/sfinfo.channels)
{
- if(sample->actual.format == AUDIO_U8)
- format = AL_FORMAT_STEREO8;
- else if(sample->actual.format == AUDIO_S16SYS)
- format = AL_FORMAT_STEREO16;
- else
- {
- fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format);
- Sound_FreeSample(sample);
- return 0;
- }
+ fprintf(stderr, "Bad sample count in %s (%" PRId64 ")\n", filename, sfinfo.frames);
+ sf_close(sndfile);
+ return 0;
}
+
+ /* Get the sound format, and figure out the OpenAL format */
+ if(sfinfo.channels == 1)
+ format = AL_FORMAT_MONO16;
+ else if(sfinfo.channels == 2)
+ format = AL_FORMAT_STEREO16;
else
{
- fprintf(stderr, "Unsupported channel count: %d\n", sample->actual.channels);
- Sound_FreeSample(sample);
+ fprintf(stderr, "Unsupported channel count: %d\n", sfinfo.channels);
+ sf_close(sndfile);
return 0;
}
- /* Decode the whole audio stream to a buffer. */
- slen = Sound_DecodeAll(sample);
- if(!sample->buffer || slen == 0)
+ /* Decode the whole audio file to a buffer. */
+ membuf = malloc((size_t)(sfinfo.frames * sfinfo.channels) * sizeof(short));
+
+ num_frames = sf_readf_short(sndfile, membuf, sfinfo.frames);
+ if(num_frames < 1)
{
- fprintf(stderr, "Failed to read audio from %s\n", filename);
- Sound_FreeSample(sample);
+ free(membuf);
+ sf_close(sndfile);
+ fprintf(stderr, "Failed to read samples in %s (%" PRId64 ")\n", filename, num_frames);
return 0;
}
+ num_bytes = (ALsizei)(num_frames * sfinfo.channels) * (ALsizei)sizeof(short);
/* Buffer the audio data into a new buffer object, then free the data and
- * close the file. */
+ * close the file.
+ */
buffer = 0;
alGenBuffers(1, &buffer);
- alBufferData(buffer, format, sample->buffer, (ALsizei)slen, (ALsizei)sample->actual.rate);
- Sound_FreeSample(sample);
+ alBufferData(buffer, format, membuf, num_bytes, sfinfo.samplerate);
+
+ free(membuf);
+ sf_close(sndfile);
/* Check if an error occured, and clean up if so. */
err = alGetError();
@@ -136,14 +131,10 @@ int main(int argc, char **argv)
if(InitAL(&argv, &argc) != 0)
return 1;
- /* Initialize SDL_sound. */
- Sound_Init();
-
/* Load the sound into a buffer. */
buffer = LoadSound(argv[0]);
if(!buffer)
{
- Sound_Quit();
CloseAL();
return 1;
}
@@ -171,7 +162,6 @@ int main(int argc, char **argv)
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
- Sound_Quit();
CloseAL();
return 0;