📄 write_read_test.tpl
字号:
} ; if (do_all || ! strcmp (argv [1], "sds")) { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_TRUE) ; pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_TRUE) ; pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_TRUE) ; test_count++ ; } ; if (do_all || ! strcmp (argv [1], "sd2")) { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ; pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ; pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ; test_count++ ; } ; if (test_count == 0) { printf ("Mono : ************************************\n") ; printf ("Mono : * No '%s' test defined.\n", argv [1]) ; printf ("Mono : ************************************\n") ; return 1 ; } ; /* Only open file descriptors should be stdin, stdout and stderr. */ check_open_file_count_or_die (__LINE__) ; return 0 ;} /* main *//*============================================================================================** Helper functions and macros.*/static void create_short_file (const char *filename) ;#define CHAR_ERROR(x,y) (abs ((x) - (y)) > 255)#define INT_ERROR(x,y) (((x) - (y)) != 0)#define TRIBYTE_ERROR(x,y) (abs ((x) - (y)) > 255)#define FLOAT_ERROR(x,y) (fabs ((x) - (y)) > 1e-5)#define CONVERT_DATA(k,len,new,orig) \ { for ((k) = 0 ; (k) < (len) ; (k) ++) \ (new) [k] = (orig) [k] ; \ }[+ FOR data_type+]/*======================================================================================*/static voidpcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_file_ok){ SNDFILE *file ; SF_INFO sfinfo ; [+ (get "data_type") +] *orig, *test ; sf_count_t count ; int k, items, frames, pass, allow_fd ; /* Sd2 files cannot be opened from an existing file descriptor. */ allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; print_test_name ("pcm_test_[+ (get "type_name") +]", filename) ; sfinfo.samplerate = 44100 ; sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ sfinfo.channels = 1 ; sfinfo.format = format ; gen_windowed_sine_double (orig_data, DATA_LENGTH, [+ (get "max_val") +]) ; orig = ([+ (get "data_type") +]*) orig_data ; test = ([+ (get "data_type") +]*) test_data ; /* Make this a macro so gdb steps over it in one go. */ CONVERT_DATA (k, DATA_LENGTH, orig, orig_data) ; items = DATA_LENGTH ; file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; sf_set_string (file, SF_STR_ARTIST, "Your name here") ; test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ; /* Add non-audio data after the audio. */ sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; sf_close (file) ; memset (test, 0, items * sizeof ([+ (get "data_type") +])) ; if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) memset (&sfinfo, 0, sizeof (sfinfo)) ; file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; if (sfinfo.format != format) { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; exit (1) ; } ; if (sfinfo.frames < items) { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; exit (1) ; } ; if (! long_file_ok && sfinfo.frames > items) { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), items) ; exit (1) ; } ; if (sfinfo.channels != 1) { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; exit (1) ; } ; check_log_buffer_or_die (file, __LINE__) ; test_read_[+ (get "data_type") +]_or_die (file, 0, test, items, __LINE__) ; for (k = 0 ; k < items ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; exit (1) ; } ; /* Seek to start of file. */ test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; test_read_[+ (get "data_type") +]_or_die (file, 0, test, 4, __LINE__) ; for (k = 0 ; k < 4 ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; exit (1) ; } ; if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) { sf_close (file) ; unlink (filename) ; printf ("ok\n") ; return ; } ; /* Seek to offset from start of file. */ test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; for (k = 10 ; k < 14 ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; exit (1) ; } ; /* Seek to offset from current position. */ test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; test_read_[+ (get "data_type") +]_or_die (file, 0, test + 20, 4, __LINE__) ; for (k = 20 ; k < 24 ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; exit (1) ; } ; /* Seek to offset from end of file. */ test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; for (k = 10 ; k < 14 ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; exit (1) ; } ; /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; count = 0 ; while (count < sfinfo.frames) count += sf_read_[+ (get "data_type") +] (file, test, 311) ; /* Check that no error has occurred. */ if (sf_error (file)) { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; puts (sf_strerror (file)) ; exit (1) ; } ; /* Check that we haven't read beyond EOF. */ if (count > sfinfo.frames) { printf ("\n\nLines %d : read past end of file (%ld should be %ld)\n", __LINE__, (long) count, (long) sfinfo.frames) ; exit (1) ; } ; test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; sf_close (file) ; /*================================================================================== ** Now test Mono RDWR. */ sfinfo.samplerate = SAMPLE_RATE ; sfinfo.frames = DATA_LENGTH ; sfinfo.channels = 1 ; sfinfo.format = format ; if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) unlink (filename) ; else { /* Create a short file. */ create_short_file (filename) ; /* Opening a already existing short file (ie invalid header) RDWR is disallowed. ** If this returns a valif pointer sf_open() screwed up. */ if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; exit (1) ; } ; /* Truncate the file to zero bytes. */ if (truncate (filename, 0) < 0) { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ; perror (NULL) ; exit (1) ; } ; } ; /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain ** all the usual data required when opening the file in WRITE mode. */ sfinfo.samplerate = SAMPLE_RATE ; sfinfo.frames = DATA_LENGTH ; sfinfo.channels = 1 ; sfinfo.format = format ; file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; /* Do 3 writes followed by reads. After each, check the data and the current ** read and write offsets. */ for (pass = 1 ; pass <= 3 ; pass ++) { orig [20] = pass * 2 ; /* Write some data. */ test_write_[+ (get "data_type") +]_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; /* Read what we just wrote. */ test_read_[+ (get "data_type") +]_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; /* Check the data. */ for (k = 0 ; k < DATA_LENGTH ; k++) if ([+ (get "error_func") +] (orig [k], test [k])) { printf ("\n\nLine %d (pass %d): Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ; oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ; exit (1) ; } ; test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; } ; /* for (pass ...) */ sf_close (file) ; /* Open the file again to check the data. */ file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; if (sfinfo.format != format) { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; exit (1) ; } ; if (sfinfo.frames < 3 * DATA_LENGTH) { printf ("\n\nLine %d : Not enough frames in file. (%ld < %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; exit (1) ; } if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) { printf ("\n\nLine %d : Incorrect number of frames in file. (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 3 * DATA_LENGTH ) ; exit (1) ; } ; if (sfinfo.channels != 1) { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; exit (1) ; } ; if (! long_file_ok) test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -