OSDN Git Service

Updated the depended module.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Mon, 27 Aug 2012 21:40:15 +0000 (06:40 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Mon, 27 Aug 2012 21:40:15 +0000 (06:40 +0900)
soft/utils/common/tinywavio/wavfile.c [moved from soft/utils/common/tinywavio/wavfile.cpp with 95% similarity]
soft/utils/common/tinywavio/wavfile.h
soft/utils/ffttool/Makefile
soft/utils/ffttool/main.c

similarity index 95%
rename from soft/utils/common/tinywavio/wavfile.cpp
rename to soft/utils/common/tinywavio/wavfile.c
index b2152ad..813b51e 100644 (file)
@@ -78,15 +78,16 @@ struct WAVFILE {
     FILE *fp;                   /**< ファイルハンドラ。 */
     char filename[BUFSIZ];      /**< ファイル名。 */
     WavFileMode mode;           /**< ファイルモード。 */
-    bool info_checked;          /**< infoを確認したら真になるフラグ。 */
-    bool data_checked;          /**< dataを確認したら真になるフラグ。 */
+    int info_checked;          /**< infoを確認したら真になるフラグ。 */
+    int data_checked;          /**< dataを確認したら真になるフラグ。 */
     uint32_t data_byte_count;   /**< データバイトカウント。 */
     wavfile_info_t info;        /**< 対象ファイルのinfo情報。制御の確認用に用いる。 */
 };
 
 static int WRITE_U32_BE(FILE *fp, const uint32_t value)
 {
-    for (int i = 0; i < 4; i++) {
+    int i;
+    for (i = 0; i < 4; i++) {
         if (fputc((value >> (8 * (3 - i))), fp) == EOF) {
             return -1;
         }
@@ -96,7 +97,8 @@ static int WRITE_U32_BE(FILE *fp, const uint32_t value)
 
 static int WRITE_U32_LE(FILE *fp, const uint32_t value)
 {
-    for (int i = 0; i < 4; i++) {
+    int i;
+    for (i = 0; i < 4; i++) {
         if (fputc((value >> (8 * i)), fp) == EOF) {
             return -1;
         }
@@ -106,7 +108,8 @@ static int WRITE_U32_LE(FILE *fp, const uint32_t value)
 
 static int WRITE_U16_LE(FILE *fp, const uint16_t value)
 {
-    for (int i = 0; i < 2; i++) {
+    int i;
+    for (i = 0; i < 2; i++) {
         if (fputc((value >> (8 * i)), fp) == EOF) {
             return -1;
         }
@@ -117,7 +120,8 @@ static int WRITE_U16_LE(FILE *fp, const uint16_t value)
 static int READ_U32_BE(FILE *fp, uint32_t *value)
 {
     int raw[4];
-    for (int i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
+    int i;
+    for (i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
         raw[i] = fgetc(fp);
         if (raw[i] == EOF) {
             *value = 0x00000000;
@@ -135,7 +139,8 @@ static int READ_U32_BE(FILE *fp, uint32_t *value)
 static int READ_U32_LE(FILE *fp, uint32_t *value)
 {
     int raw[4];
-    for (int i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
+    int i;
+    for (i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
         raw[i] = fgetc(fp);
         if (raw[i] == EOF) {
             *value = 0x00000000;
@@ -153,7 +158,8 @@ static int READ_U32_LE(FILE *fp, uint32_t *value)
 static int READ_U16_LE(FILE *fp, uint16_t *value)
 {
     int raw[2];
-    for (int i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
+    int i;
+    for (i = 0; i < (int)(sizeof(raw) / sizeof(raw[0])); i++) {
         raw[i] = fgetc(fp);
         if (raw[i] == EOF) {
             *value = 0x00000000;
@@ -171,7 +177,8 @@ static WavFileResult chunk_reader_unknown(
         const uint32_t chunk_size,
         FILE *fp)
 {
-    for (int i = 0; i < (int)chunk_size; i++) {
+    int i;
+    for (i = 0; i < (int)chunk_size; i++) {
         int c = fgetc(fp);
         if (c == EOF) {
             return WavFileResultErrorBrokenChunkData;
@@ -280,6 +287,9 @@ static WavFileResult chunk_reader_fmt(
 
 WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *result)
 {
+    FILE *fp = NULL;
+    WAVFILE *p = NULL;
+
     /*
      * ファイル名を検証する。
      */
@@ -291,7 +301,6 @@ WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *res
     /*
      * ファイルを開く。
      */
-    FILE *fp = NULL;
     switch (mode) {
         case WavFileModeRead:
             fp = fopen(filename, "rb");
@@ -311,7 +320,7 @@ WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *res
     /*
      * ハンドラ領域を確保する。
      */
-    WAVFILE *p = (WAVFILE *)malloc(sizeof(WAVFILE));
+    p = (WAVFILE *)malloc(sizeof(WAVFILE));
     if (p == NULL) {
         *result = WavFileResultErrorMemoryAllocation;
         return NULL;
@@ -323,8 +332,8 @@ WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *res
     p->fp = fp;
     strcpy(p->filename, filename);
     p->mode = mode;
-    p->info_checked = false;
-    p->data_checked = false;
+    p->info_checked = 0;
+    p->data_checked = 0;
     p->data_byte_count = 0;
     WAVFILE_INFO_AUDIO_FORMAT(&(p->info)) = 0;
     WAVFILE_INFO_NUM_CHANNELS(&(p->info)) = 0;
@@ -471,7 +480,7 @@ WavFileResult wavfile_read_info(WAVFILE *p, wavfile_info_t *info)
                 break;
             case CHUNK_ID_DATA:
                 {
-                    p->info_checked = true;
+                    p->info_checked = 1;
                     p->data_byte_count = chunk_size;
                     goto finalize;
                 }
@@ -496,6 +505,7 @@ finalize:
  */
 WavFileResult wavfile_read_data(WAVFILE *p, wavfile_data_t *data)
 {
+    int i;
     if (p == NULL) {
         return WavFileResultErrorInvalidHandler;
     }
@@ -510,14 +520,14 @@ WavFileResult wavfile_read_data(WAVFILE *p, wavfile_data_t *data)
 
     if (p->data_byte_count == 0) {
         data->num_channels = 0;
-        for (int i = 0; i < p->info.num_channels; i++) {
+        for (i = 0; i < p->info.num_channels; i++) {
             data->channel_data[i] = 0.5;
         }
         return WavFileResultOK;
     }
 
     data->num_channels = p->info.num_channels;
-    for (int i = 0; i < p->info.num_channels; i++) {
+    for (i = 0; i < p->info.num_channels; i++) {
         switch (p->info.bits_per_sample) {
             case BITS_PER_SAMPLE_8:
                 {
@@ -531,34 +541,38 @@ WavFileResult wavfile_read_data(WAVFILE *p, wavfile_data_t *data)
                 break;
             case BITS_PER_SAMPLE_16:
                 {
-                    int c1 = fgetc(p->fp);
+                    int c1, c2;
+                    uint16_t n;
+                    c1 = fgetc(p->fp);
                     if (c1 == EOF) {
                         return WavFileResultErrorBrokenChunkData;
                     }
-                    int c2 = fgetc(p->fp);
+                    c2 = fgetc(p->fp);
                     if (c2 == EOF) {
                         return WavFileResultErrorBrokenChunkData;
                     }
-                    uint16_t n = (((uint16_t)c2 << 8) | ((uint16_t)c1 << 0)) ^ (1 << 15);
+                    n = (((uint16_t)c2 << 8) | ((uint16_t)c1 << 0)) ^ (1 << 15);
                     data->channel_data[i] = (double)n / 0xFFFF;
                 }
                 p->data_byte_count-=2;
                 break;
             case BITS_PER_SAMPLE_24:
                 {
-                    int c1 = fgetc(p->fp);
+                    int c1, c2, c3;
+                    uint32_t n;
+                    c1 = fgetc(p->fp);
                     if (c1 == EOF) {
                         return WavFileResultErrorBrokenChunkData;
                     }
-                    int c2 = fgetc(p->fp);
+                    c2 = fgetc(p->fp);
                     if (c2 == EOF) {
                         return WavFileResultErrorBrokenChunkData;
                     }
-                    int c3 = fgetc(p->fp);
+                    c3 = fgetc(p->fp);
                     if (c3 == EOF) {
                         return WavFileResultErrorBrokenChunkData;
                     }
-                    uint32_t n = (((uint32_t)c3 << 16) | ((uint32_t)c2 << 8) | ((uint32_t)c1 << 0)) ^ (1 << 23);
+                    n = (((uint32_t)c3 << 16) | ((uint32_t)c2 << 8) | ((uint32_t)c1 << 0)) ^ (1 << 23);
                     data->channel_data[i] = (double)n / 0xFFFFFF;
                 }
                 p->data_byte_count-=3;
@@ -693,6 +707,13 @@ WavFileResult wavfile_write_info(WAVFILE *p, const wavfile_info_t *info)
             break;
         case WAVFILE_AUDIO_FORMAT_EXTENSIBLE:
             {
+                static const unsigned char sub_format[16] = {
+                    0x01, 0x00, 0x00, 0x00,
+                    0x00, 0x00, 0x10, 0x00,
+                    0x80, 0x00, 0x00, 0xAA,
+                    0x00, 0x38, 0x9B, 0x71
+                };
+                int i;
                 if (WRITE_U32_BE(p->fp, CHUNK_ID_FMT) != 0) {
                     result = WavFileResultErrorFileWrite;
                     goto finalize;
@@ -745,13 +766,7 @@ WavFileResult wavfile_write_info(WAVFILE *p, const wavfile_info_t *info)
                     result = WavFileResultErrorFileWrite;
                     goto finalize;
                 }
-                static const unsigned char sub_format[16] = {
-                    0x01, 0x00, 0x00, 0x00,
-                    0x00, 0x00, 0x10, 0x00,
-                    0x80, 0x00, 0x00, 0xAA,
-                    0x00, 0x38, 0x9B, 0x71
-                };
-                for (int i = 0; i < sizeof(sub_format); i++) {
+                for (i = 0; i < sizeof(sub_format); i++) {
                     fputc((char)sub_format[i], p->fp);
                 }
             }
@@ -793,7 +808,7 @@ WavFileResult wavfile_write_info(WAVFILE *p, const wavfile_info_t *info)
 
 finalize:
     if (WavFileResultOK == result) {
-        p->info_checked = true;
+        p->info_checked = 1;
     }
     return result;
 }
@@ -803,6 +818,7 @@ finalize:
  */
 WavFileResult wavfile_write_data(WAVFILE *p, const wavfile_data_t *data)
 {
+    int i;
     WavFileResult result = WavFileResultOK;
 
     if (p == NULL) {
@@ -825,7 +841,7 @@ WavFileResult wavfile_write_data(WAVFILE *p, const wavfile_data_t *data)
         goto finalize;
     }
 
-    for (int i = 0; i < p->info.num_channels; i++) {
+    for (i = 0; i < p->info.num_channels; i++) {
         switch (p->info.bits_per_sample) {
             case BITS_PER_SAMPLE_8:
                 {
@@ -871,7 +887,7 @@ WavFileResult wavfile_write_data(WAVFILE *p, const wavfile_data_t *data)
                 break;
         }
     }
-    p->data_checked = true;
+    p->data_checked = 1;
 
 finalize:
     return result;
index b839e1d..453709b 100644 (file)
@@ -76,7 +76,7 @@ typedef struct {
 /**
  * @brief エラーコード。
  */
-enum WavFileResult {
+typedef enum {
     WavFileResultOK,
     WavFileResultErrorInvalidFileName,
     WavFileResultErrorMemoryAllocation,
@@ -104,15 +104,15 @@ enum WavFileResult {
     WavFileResultErrorNeedInfoChecked,
     WavFileResultErrorNeedDataChecked,
     WavFileResultErrorInvalidHandler,
-};
+} WavFileResult;
 
 /**
  * @brief ファイルモード。
  */
-enum WavFileMode {
+typedef enum {
     WavFileModeRead,    /**< ファイルは読み込みモード。 */
     WavFileModeWrite,   /**< ファイルは書き込みモード。 */
-};
+} WavFileMode;
 
 WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *result);
 WavFileResult wavfile_read_info(WAVFILE *p, wavfile_info_t *info);
index 0504cca..a23c1cd 100644 (file)
@@ -1,2 +1,2 @@
 ffttool: fft.c fft.h main.c Makefile sample.wav wave.c wave.h
-       $(CC) -o $@ fft.c wave.c main.c -lm
+       $(CC) -o $@ fft.c wave.c ../common/tinywavio/wavfile.c main.c -I../common/tinywavio -lm
index 9a8aa04..f3f47f9 100644 (file)
@@ -3,6 +3,140 @@
 #include <stdlib.h>\r
 #include "wave.h"\r
 #include "fft.h"\r
+#include "wavfile.h"\r
+\r
+/**\r
+ * @brief \83G\83\89\81[\82ª\82 \82Á\82½\8e\9e\82É\95W\8f\80\8fo\97Í\82É\89½\82©\8fo\82·\81B\r
+ *\r
+ * @param RESULT \83G\83\89\81[\83R\81[\83h\81B\r
+ */\r
+#define WAVFILE_ERROR_PRINT(RESULT) \\r
+    do { \\r
+        WavFileResult R = RESULT; \\r
+        if (R != WavFileResultOK) { \\r
+            char wavfile_error_print_text[BUFSIZ]; \\r
+            wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \\r
+            printf("%s (code=%d)\n", wavfile_error_print_text, R); \\r
+            return 1; \\r
+        } \\r
+    } while(0)\r
+\r
+/**\r
+ * @brief Channel separation test.\r
+ *\r
+ * @param filename Source file name.\r
+ */\r
+static int channel_separation(const char *filename)\r
+{\r
+    WavFileResult result;\r
+    wavfile_info_t info_input;\r
+    wavfile_info_t info_output;\r
+    WAVFILE *wf_input;\r
+    WAVFILE *wf_output[WAVFILE_MAXIMUM_CHANNELS];\r
+    int i;\r
+\r
+    /*\r
+     * \93ü\97Í\83t\83@\83C\83\8b\82ð\8aJ\82­\81B\r
+     */\r
+    wf_input = wavfile_open(filename, WavFileModeRead, &result);\r
+    WAVFILE_ERROR_PRINT(result);\r
+\r
+    /*\r
+     * \93ü\97Í\83t\83@\83C\83\8b\82©\82ç\8fî\95ñ\82ð\93Ç\82Ý\8d\9e\82Þ\81B\r
+     */\r
+    WAVFILE_ERROR_PRINT(wavfile_read_info(wf_input, &info_input));\r
+\r
+    /*\r
+     * \8e¯\95Ê\8fî\95ñ\82ð\95\\8e¦\82·\82é\81B\r
+     */\r
+    printf("[INPUT]\n");\r
+    printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info)    = %d\n", WAVFILE_INFO_AUDIO_FORMAT(&info_input));\r
+    printf("\tWAVFILE_INFO_NUM_CHANNELS(&info)    = %d\n", WAVFILE_INFO_NUM_CHANNELS(&info_input));\r
+    printf("\tWAVFILE_INFO_SAMPLE_RATE(&info)     = %d\n", WAVFILE_INFO_SAMPLE_RATE(&info_input));\r
+    printf("\tWAVFILE_INFO_BYTE_RATE(&info)       = %d\n", WAVFILE_INFO_BYTE_RATE(&info_input));\r
+    printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info)     = %d\n", WAVFILE_INFO_BLOCK_ALIGN(&info_input));\r
+    printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info_input));\r
+\r
+    /*\r
+     * \93ü\97Í\82©\82ç\93¾\82½\8fî\95ñ\82ð\8aî\82É\81A\8fo\97Í\82Ì\8fî\95ñ\82ð\90\90¬\82·\82é\81B\r
+     */\r
+    WAVFILE_INFO_AUDIO_FORMAT(&info_output)    = WAVFILE_INFO_AUDIO_FORMAT(&info_input);\r
+    WAVFILE_INFO_NUM_CHANNELS(&info_output)    = WAVFILE_INFO_NUM_CHANNELS(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
+    WAVFILE_INFO_SAMPLE_RATE(&info_output)     = WAVFILE_INFO_SAMPLE_RATE(&info_input);\r
+    WAVFILE_INFO_BYTE_RATE(&info_output)       = WAVFILE_INFO_BYTE_RATE(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
+    WAVFILE_INFO_BLOCK_ALIGN(&info_output)     = WAVFILE_INFO_BLOCK_ALIGN(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
+    WAVFILE_INFO_BITS_PER_SAMPLE(&info_output) = WAVFILE_INFO_BITS_PER_SAMPLE(&info_input);\r
+\r
+    /*\r
+     * \8e¯\95Ê\8fî\95ñ\82ð\95\\8e¦\82·\82é\81B\r
+     */\r
+    printf("[OUTPUT]\n");\r
+    printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info)    = %d\n", WAVFILE_INFO_AUDIO_FORMAT(&info_output));\r
+    printf("\tWAVFILE_INFO_NUM_CHANNELS(&info)    = %d\n", WAVFILE_INFO_NUM_CHANNELS(&info_output));\r
+    printf("\tWAVFILE_INFO_SAMPLE_RATE(&info)     = %d\n", WAVFILE_INFO_SAMPLE_RATE(&info_output));\r
+    printf("\tWAVFILE_INFO_BYTE_RATE(&info)       = %d\n", WAVFILE_INFO_BYTE_RATE(&info_output));\r
+    printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info)     = %d\n", WAVFILE_INFO_BLOCK_ALIGN(&info_output));\r
+    printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info_output));\r
+\r
+    /*\r
+     * \83t\83@\83C\83\8b\82ð\8aJ\82¢\82Ä\83w\83b\83_\82ð\8f\91\82­\81B\r
+     */\r
+    for (i = 0; i < WAVFILE_INFO_NUM_CHANNELS(&info_input); i++) {\r
+        /*\r
+         * \8fo\97Í\83t\83@\83C\83\8b\82ð\8aJ\82­\81B\r
+         */\r
+        char buf[BUFSIZ];\r
+        sprintf(buf, "%s-ch%02d.wav", filename, i);\r
+        wf_output[i] = wavfile_open(buf, WavFileModeWrite, &result);\r
+        WAVFILE_ERROR_PRINT(result);\r
+\r
+        /*\r
+         * \8fo\97Í\83t\83@\83C\83\8b\82Ö\8fî\95ñ\82ð\8f\91\82«\8d\9e\82Þ\81B\r
+         */\r
+        WAVFILE_ERROR_PRINT(wavfile_write_info(wf_output[i], &info_output));\r
+    }\r
+\r
+    while (1) {\r
+        wavfile_data_t data_input;\r
+        wavfile_data_t data_output;\r
+\r
+        /*\r
+         * \93ü\97Í\83t\83@\83C\83\8b\82©\82ç\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ\81B\r
+         */\r
+        WAVFILE_ERROR_PRINT(wavfile_read_data(wf_input, &data_input));\r
+\r
+        /*\r
+         * \83f\81[\83^\82ª\82±\82ê\88È\8fã\82È\82¯\82ê\82Î\8fI\97¹\81B\r
+         */\r
+        if (WAVFILE_DATA_IS_END_OF_DATA(&data_input)) {\r
+            break;\r
+        }\r
+\r
+        /*\r
+         * \8fo\97Í\83t\83@\83C\83\8b\82Ö\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ\81B\r
+         */\r
+        for (i = 0; i < WAVFILE_DATA_NUM_CHANNELS(&data_input); i++) {\r
+            WAVFILE_DATA_NUM_CHANNELS(&data_output) = 1;\r
+            WAVFILE_DATA_CHANNEL_DATA(&data_output, 0) = WAVFILE_DATA_CHANNEL_DATA(&data_input, i);\r
+            WAVFILE_ERROR_PRINT(wavfile_write_data(wf_output[i], &data_output));\r
+        }\r
+    }\r
+\r
+    /*\r
+     * \93ü\97Í\83t\83@\83C\83\8b\82ð\95Â\82\82é\81B\r
+     */\r
+    WAVFILE_ERROR_PRINT(wavfile_close(wf_input));\r
+\r
+    /*\r
+     * \8fo\97Í\83t\83@\83C\83\8b\82ð\95Â\82\82é\81B\r
+     */\r
+    for (i = 0; i < WAVFILE_INFO_NUM_CHANNELS(&info_input); i++) {\r
+        WAVFILE_ERROR_PRINT(wavfile_close(wf_output[i]));\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
 \r
 int main(int argc, char **argv)\r
 {\r