|
|
1.1 ! root 1: /* ! 2: * recordchaintest.c - this test shows how to chain small recordings ! 3: * and append them to a soundfile. ! 4: * ! 5: * 2/28/94 -- Made architecture independent (rkd). ! 6: */ ! 7: ! 8: #import <stdio.h> ! 9: #import <sound/sound.h> ! 10: #import <architecture/byte_order.h> ! 11: ! 12: #define NUM_BUFFERS 2 ! 13: #define BUF_SIZE 8192 ! 14: #define SECONDS 5.0 ! 15: ! 16: static SNDSoundStruct *buffers[NUM_BUFFERS]; ! 17: static FILE *sfp; ! 18: static int requestedDataSize, recordedDataSize = 0; ! 19: static int lastBufNum; ! 20: ! 21: static void record(int tag); ! 22: ! 23: static int recordDone(SNDSoundStruct *s, int tag, int err) ! 24: /* ! 25: * Called when a buffer has been recorded. ! 26: * Appends the buffer to the soundfile and initiates recording into it again. ! 27: */ ! 28: { ! 29: if (recordedDataSize >= requestedDataSize) ! 30: return 0; ! 31: if (err) ! 32: fprintf(stderr, "recordDone: %s\n", SNDSoundError(err)); ! 33: if (fwrite((void *)((char *)s + s->dataLocation), 1, s->dataSize, sfp) != ! 34: s->dataSize) ! 35: fprintf(stderr, "recordDone: could not write data to soundfile\n"); ! 36: recordedDataSize += s->dataSize; ! 37: record((lastBufNum + 1) % NUM_BUFFERS); ! 38: return 0; ! 39: } ! 40: ! 41: static void record(int bufNum) ! 42: /* ! 43: * Initiates recording into a buffers[bufNum]. ! 44: */ ! 45: { ! 46: int err; ! 47: static int tag = 1; ! 48: ! 49: lastBufNum = bufNum; ! 50: if (err = SNDStartRecording(buffers[bufNum], tag++, 0, 0, SND_NULL_FUN, ! 51: recordDone)) ! 52: fprintf(stderr, "record: %s\n", SNDSoundError(err)); ! 53: } ! 54: ! 55: static void init(int n, int size, char *fileName) ! 56: /* ! 57: * Allocate n sound buffers. ! 58: * Creates the soundfile. ! 59: */ ! 60: { ! 61: int i, err; ! 62: SNDSoundStruct s; ! 63: ! 64: for (i = 0; i < n; i++) ! 65: if (err = SNDAlloc(&buffers[i], size, SND_FORMAT_MULAW_8, ! 66: SND_RATE_CODEC, 1, 4)) ! 67: fprintf(stderr, "init: %s\n", SNDSoundError(err)); ! 68: if ((sfp = fopen(fileName, "w")) == NULL) ! 69: fprintf(stderr, "init: could not open soundfile %s\n", fileName); ! 70: if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1) ! 71: fprintf(stderr, "init: could not write dummy header to soundfile\n"); ! 72: } ! 73: ! 74: static void cleanup(void) ! 75: /* ! 76: * Write the soundfile header. ! 77: */ ! 78: { ! 79: SNDSoundStruct s; ! 80: ! 81: s.magic = NXSwapHostIntToBig(SND_MAGIC); ! 82: s.dataLocation = NXSwapHostIntToBig(sizeof(SNDSoundStruct)); ! 83: s.dataSize = NXSwapHostIntToBig(recordedDataSize); ! 84: s.dataFormat = NXSwapHostIntToBig(SND_FORMAT_MULAW_8); ! 85: s.samplingRate = NXSwapHostIntToBig(SND_RATE_CODEC); ! 86: s.channelCount = NXSwapHostIntToBig(1); ! 87: s.info[0] = '\0'; ! 88: ! 89: rewind(sfp); ! 90: if (fwrite((void *)&s, sizeof(SNDSoundStruct), 1, sfp) != 1) ! 91: fprintf(stderr, "cleanup: could not write header to soundfile\n"); ! 92: } ! 93: ! 94: main(int argc, char *argv[]) ! 95: { ! 96: int i; ! 97: ! 98: if (argc != 2) { ! 99: fprintf(stderr, "usage: recordchaintest file\n"); ! 100: exit(1); ! 101: } ! 102: ! 103: requestedDataSize = SECONDS * SND_RATE_CODEC; ! 104: init(NUM_BUFFERS, BUF_SIZE, argv[1]); ! 105: printf("recording...\n"); ! 106: for (i = 0; i < NUM_BUFFERS; i++) ! 107: record(i); ! 108: SNDWait(0); ! 109: cleanup(); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.