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;
}
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;
}
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;
}
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;
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;
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;
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;
WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *result)
{
+ FILE *fp = NULL;
+ WAVFILE *p = NULL;
+
/*
* ファイル名を検証する。
*/
/*
* ファイルを開く。
*/
- FILE *fp = NULL;
switch (mode) {
case WavFileModeRead:
fp = fopen(filename, "rb");
/*
* ハンドラ領域を確保する。
*/
- WAVFILE *p = (WAVFILE *)malloc(sizeof(WAVFILE));
+ p = (WAVFILE *)malloc(sizeof(WAVFILE));
if (p == NULL) {
*result = WavFileResultErrorMemoryAllocation;
return NULL;
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;
break;
case CHUNK_ID_DATA:
{
- p->info_checked = true;
+ p->info_checked = 1;
p->data_byte_count = chunk_size;
goto finalize;
}
*/
WavFileResult wavfile_read_data(WAVFILE *p, wavfile_data_t *data)
{
+ int i;
if (p == NULL) {
return WavFileResultErrorInvalidHandler;
}
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:
{
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;
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;
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);
}
}
finalize:
if (WavFileResultOK == result) {
- p->info_checked = true;
+ p->info_checked = 1;
}
return result;
}
*/
WavFileResult wavfile_write_data(WAVFILE *p, const wavfile_data_t *data)
{
+ int i;
WavFileResult result = WavFileResultOK;
if (p == NULL) {
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:
{
break;
}
}
- p->data_checked = true;
+ p->data_checked = 1;
finalize:
return result;
#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