1b815c7f3Sopenharmony_ci/* 2b815c7f3Sopenharmony_ci** Copyright (C) 2011-2017 Erik de Castro Lopo <erikd@mega-nerd.com> 3b815c7f3Sopenharmony_ci** 4b815c7f3Sopenharmony_ci** This program is free software; you can redistribute it and/or modify 5b815c7f3Sopenharmony_ci** it under the terms of the GNU General Public License as published by 6b815c7f3Sopenharmony_ci** the Free Software Foundation; either version 2 of the License, or 7b815c7f3Sopenharmony_ci** (at your option) any later version. 8b815c7f3Sopenharmony_ci** 9b815c7f3Sopenharmony_ci** This program is distributed in the hope that it will be useful, 10b815c7f3Sopenharmony_ci** but WITHOUT ANY WARRANTY; without even the implied warranty of 11b815c7f3Sopenharmony_ci** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12b815c7f3Sopenharmony_ci** GNU General Public License for more details. 13b815c7f3Sopenharmony_ci** 14b815c7f3Sopenharmony_ci** You should have received a copy of the GNU General Public License 15b815c7f3Sopenharmony_ci** along with this program; if not, write to the Free Software 16b815c7f3Sopenharmony_ci** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17b815c7f3Sopenharmony_ci*/ 18b815c7f3Sopenharmony_ci 19b815c7f3Sopenharmony_ci#include "sfconfig.h" 20b815c7f3Sopenharmony_ci 21b815c7f3Sopenharmony_ci#include <stdio.h> 22b815c7f3Sopenharmony_ci#include <stdlib.h> 23b815c7f3Sopenharmony_ci#include <string.h> 24b815c7f3Sopenharmony_ci 25b815c7f3Sopenharmony_ci#if HAVE_UNISTD_H 26b815c7f3Sopenharmony_ci#include <unistd.h> 27b815c7f3Sopenharmony_ci#else 28b815c7f3Sopenharmony_ci#include "sf_unistd.h" 29b815c7f3Sopenharmony_ci#endif 30b815c7f3Sopenharmony_ci 31b815c7f3Sopenharmony_ci#include "sndfile.h" 32b815c7f3Sopenharmony_ci#include "utils.h" 33b815c7f3Sopenharmony_ci 34b815c7f3Sopenharmony_cistatic void format_error_test (void) ; 35b815c7f3Sopenharmony_cistatic void format_combo_test (void) ; 36b815c7f3Sopenharmony_ci 37b815c7f3Sopenharmony_ciint 38b815c7f3Sopenharmony_cimain (void) 39b815c7f3Sopenharmony_ci{ 40b815c7f3Sopenharmony_ci format_error_test () ; 41b815c7f3Sopenharmony_ci format_combo_test () ; 42b815c7f3Sopenharmony_ci 43b815c7f3Sopenharmony_ci return 0 ; 44b815c7f3Sopenharmony_ci} /* main */ 45b815c7f3Sopenharmony_ci 46b815c7f3Sopenharmony_ci/*============================================================================== 47b815c7f3Sopenharmony_ci*/ 48b815c7f3Sopenharmony_ci 49b815c7f3Sopenharmony_cistatic void 50b815c7f3Sopenharmony_ciformat_error_test (void) 51b815c7f3Sopenharmony_ci{ const char *filename = "format-error.wav" ; 52b815c7f3Sopenharmony_ci SNDFILE *file ; 53b815c7f3Sopenharmony_ci SF_INFO info ; 54b815c7f3Sopenharmony_ci 55b815c7f3Sopenharmony_ci print_test_name (__func__, NULL) ; 56b815c7f3Sopenharmony_ci 57b815c7f3Sopenharmony_ci memset (&info, 0, sizeof (info)) ; 58b815c7f3Sopenharmony_ci info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; 59b815c7f3Sopenharmony_ci info.channels = 1 ; 60b815c7f3Sopenharmony_ci info.samplerate = 44100 ; 61b815c7f3Sopenharmony_ci 62b815c7f3Sopenharmony_ci info.format = SF_FORMAT_WAV ; 63b815c7f3Sopenharmony_ci file = sf_open (filename, SFM_WRITE, &info) ; 64b815c7f3Sopenharmony_ci exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; 65b815c7f3Sopenharmony_ci exit_if_true ( 66b815c7f3Sopenharmony_ci strstr (sf_strerror (NULL), "minor format") == NULL, 67b815c7f3Sopenharmony_ci "\n\nLine %d : Error string should reference bad 'minor format'.\n\n", __LINE__ 68b815c7f3Sopenharmony_ci ) ; 69b815c7f3Sopenharmony_ci 70b815c7f3Sopenharmony_ci info.format = SF_FORMAT_PCM_16 ; 71b815c7f3Sopenharmony_ci file = sf_open (filename, SFM_WRITE, &info) ; 72b815c7f3Sopenharmony_ci exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; 73b815c7f3Sopenharmony_ci exit_if_true ( 74b815c7f3Sopenharmony_ci strstr (sf_strerror (NULL), "major format") == NULL, 75b815c7f3Sopenharmony_ci "\n\nLine %d : Error string should reference bad 'major format'.\n\n", __LINE__ 76b815c7f3Sopenharmony_ci ) ; 77b815c7f3Sopenharmony_ci 78b815c7f3Sopenharmony_ci unlink (filename) ; 79b815c7f3Sopenharmony_ci puts ("ok") ; 80b815c7f3Sopenharmony_ci} /* format_error_test */ 81b815c7f3Sopenharmony_ci 82b815c7f3Sopenharmony_cistatic void 83b815c7f3Sopenharmony_ciformat_combo_test (void) 84b815c7f3Sopenharmony_ci{ int container_max, codec_max, cont, codec ; 85b815c7f3Sopenharmony_ci 86b815c7f3Sopenharmony_ci print_test_name (__func__, NULL) ; 87b815c7f3Sopenharmony_ci 88b815c7f3Sopenharmony_ci sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &container_max, sizeof (container_max)) ; 89b815c7f3Sopenharmony_ci sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &codec_max, sizeof (codec_max)) ; 90b815c7f3Sopenharmony_ci 91b815c7f3Sopenharmony_ci for (cont = 0 ; cont < container_max + 10 ; cont ++) 92b815c7f3Sopenharmony_ci { SF_FORMAT_INFO major_fmt_info ; 93b815c7f3Sopenharmony_ci 94b815c7f3Sopenharmony_ci memset (&major_fmt_info, 0, sizeof (major_fmt_info)) ; 95b815c7f3Sopenharmony_ci major_fmt_info.format = cont ; 96b815c7f3Sopenharmony_ci (void) sf_command (NULL, SFC_GET_FORMAT_MAJOR, &major_fmt_info, sizeof (major_fmt_info)) ; 97b815c7f3Sopenharmony_ci 98b815c7f3Sopenharmony_ci for (codec = 0 ; codec < codec_max + 10 ; codec ++) 99b815c7f3Sopenharmony_ci { SF_FORMAT_INFO subtype_fmt_info ; 100b815c7f3Sopenharmony_ci SNDFILE * sndfile ; 101b815c7f3Sopenharmony_ci SF_INFO info ; 102b815c7f3Sopenharmony_ci char filename [128] ; 103b815c7f3Sopenharmony_ci int subtype_is_valid, check_is_valid ; 104b815c7f3Sopenharmony_ci 105b815c7f3Sopenharmony_ci memset (&info, 0, sizeof (info)) ; 106b815c7f3Sopenharmony_ci memset (&subtype_fmt_info, 0, sizeof (subtype_fmt_info)) ; 107b815c7f3Sopenharmony_ci subtype_fmt_info.format = codec ; 108b815c7f3Sopenharmony_ci subtype_is_valid = sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &subtype_fmt_info, sizeof (subtype_fmt_info)) == 0 ; 109b815c7f3Sopenharmony_ci 110b815c7f3Sopenharmony_ci /* Opus only works with a fixed set of sample rates. */ 111b815c7f3Sopenharmony_ci if (subtype_fmt_info.format == SF_FORMAT_OPUS) 112b815c7f3Sopenharmony_ci sf_info_setup (&info, major_fmt_info.format | subtype_fmt_info.format, 24000, 1) ; 113b815c7f3Sopenharmony_ci else 114b815c7f3Sopenharmony_ci sf_info_setup (&info, major_fmt_info.format | subtype_fmt_info.format, 22050, 1) ; 115b815c7f3Sopenharmony_ci 116b815c7f3Sopenharmony_ci check_is_valid = sf_format_check (&info) ; 117b815c7f3Sopenharmony_ci 118b815c7f3Sopenharmony_ci exit_if_true ( 119b815c7f3Sopenharmony_ci NOT (subtype_is_valid) && check_is_valid, 120b815c7f3Sopenharmony_ci "\n\nLine %d : Subtype is not valid but checks ok.\n", 121b815c7f3Sopenharmony_ci __LINE__ 122b815c7f3Sopenharmony_ci ) ; 123b815c7f3Sopenharmony_ci 124b815c7f3Sopenharmony_ci /* Only have decode, not encode support for MPEG Layer I and II */ 125b815c7f3Sopenharmony_ci if (subtype_fmt_info.format == SF_FORMAT_MPEG_LAYER_I || 126b815c7f3Sopenharmony_ci subtype_fmt_info.format == SF_FORMAT_MPEG_LAYER_II) 127b815c7f3Sopenharmony_ci continue ; 128b815c7f3Sopenharmony_ci 129b815c7f3Sopenharmony_ci /* MPEG Layer III in WAV is decode only currently */ 130b815c7f3Sopenharmony_ci if (subtype_fmt_info.format == SF_FORMAT_MPEG_LAYER_III && 131b815c7f3Sopenharmony_ci major_fmt_info.format == SF_FORMAT_WAV) 132b815c7f3Sopenharmony_ci continue ; 133b815c7f3Sopenharmony_ci 134b815c7f3Sopenharmony_ci snprintf (filename, sizeof (filename), "format-check.%s", major_fmt_info.extension) ; 135b815c7f3Sopenharmony_ci 136b815c7f3Sopenharmony_ci sndfile = sf_open (filename, SFM_WRITE, &info) ; 137b815c7f3Sopenharmony_ci 138b815c7f3Sopenharmony_ci sf_close (sndfile) ; 139b815c7f3Sopenharmony_ci unlink (filename) ; 140b815c7f3Sopenharmony_ci 141b815c7f3Sopenharmony_ci if (major_fmt_info.extension != NULL && strcmp (major_fmt_info.extension, "sd2") == 0) 142b815c7f3Sopenharmony_ci { snprintf (filename, sizeof (filename), "._format-check.%s", major_fmt_info.extension) ; 143b815c7f3Sopenharmony_ci unlink (filename) ; 144b815c7f3Sopenharmony_ci } ; 145b815c7f3Sopenharmony_ci 146b815c7f3Sopenharmony_ci exit_if_true ( 147b815c7f3Sopenharmony_ci sndfile && NOT (check_is_valid), 148b815c7f3Sopenharmony_ci "\n\nError : Format was not valid but file opened correctly.\n" 149b815c7f3Sopenharmony_ci " Container : %s\n" 150b815c7f3Sopenharmony_ci " Codec : %s\n\n", 151b815c7f3Sopenharmony_ci major_fmt_info.name, subtype_fmt_info.name 152b815c7f3Sopenharmony_ci ) ; 153b815c7f3Sopenharmony_ci 154b815c7f3Sopenharmony_ci exit_if_true ( 155b815c7f3Sopenharmony_ci NOT (sndfile) && check_is_valid, 156b815c7f3Sopenharmony_ci "\n\nError : Format was valid but file failed to open.\n" 157b815c7f3Sopenharmony_ci " Container : %s\n" 158b815c7f3Sopenharmony_ci " Codec : %s\n\n", 159b815c7f3Sopenharmony_ci major_fmt_info.name, subtype_fmt_info.name 160b815c7f3Sopenharmony_ci ) ; 161b815c7f3Sopenharmony_ci } ; 162b815c7f3Sopenharmony_ci } ; 163b815c7f3Sopenharmony_ci 164b815c7f3Sopenharmony_ci puts ("ok") ; 165b815c7f3Sopenharmony_ci} /* format_combo_test */ 166b815c7f3Sopenharmony_ci 167