|
|
1.1 root 1: /*
2: * You may freely copy, distribute and reuse the code in this example.
3: * NeXT disclaims any warranty of any kind, expressed or implied, as to
4: * its fitness for any particular use.
5: */
6:
7: #import "SaveToController.h"
8: #import <appkit/appkit.h>
9: #import <soundkit/soundkit.h>
10:
11: @implementation SaveToController
12:
13: #define LINEAR_ROW 0
14: #define MULAW_ROW 1
15: #define COMPRESSED_ROW 2
16:
17: static int _dataFormatToRow(int dataFormat)
18: {
19: int format_row;
20:
21: switch (dataFormat) {
22: case SND_FORMAT_LINEAR_16:
23: case SND_FORMAT_EMPHASIZED:
24: format_row = LINEAR_ROW;
25: break;
26: case SND_FORMAT_MULAW_8:
27: format_row = MULAW_ROW;
28: break;
29: case SND_FORMAT_COMPRESSED:
30: case SND_FORMAT_COMPRESSED_EMPHASIZED:
31: format_row = COMPRESSED_ROW;
32: break;
33: default:
34: return LINEAR_ROW; /* Try to convert unsupported formats to linear */
35: }
36: return format_row;
37: }
38:
39: static int _rowToDataFormat(int row)
40: {
41: int dataFormat;
42: switch (row) {
43: case LINEAR_ROW:
44: dataFormat = SND_FORMAT_LINEAR_16;
45: break;
46: case MULAW_ROW:
47: dataFormat = SND_FORMAT_MULAW_8;
48: break;
49: case COMPRESSED_ROW:
50: dataFormat = SND_FORMAT_COMPRESSED;
51: break;
52: default:
53: return -1;
54: }
55: return dataFormat;
56: }
57:
58: /*
59: * Note that the Sound object's convertToFormat: method will convert
60: * to or from any sampling rate. However, to minimize confusion for
61: * casual users, we restrict the choices to the three which arise
62: * naturally on the NeXT Computer.
63: */
64: static const double supportedRates[3]
65: = { SND_RATE_CODEC, SND_RATE_LOW, SND_RATE_HIGH };
66:
67: static double _rowToSamplingRate(int row)
68: {
69: if (row < 0 || row > 2) row = 2;
70: return supportedRates[row];
71: }
72:
73: static int deq(double d1, double d2)
74: /* Return 1 if d1 and d2 are "equal" to within one int step */
75: {
76: return ((abs(d1-d2)<=1.0) ? 1 : 0);
77: }
78:
79: static int _samplingRateToRow(double srate)
80: {
81: int i;
82: for (i=0; i<3; i++)
83: if (deq(srate,supportedRates[i]))
84: return i;
85: return 2; /* Try to convert unsupported rates to 44.1 KHz */
86: }
87:
88: - soundTemplate
89: /*
90: * Create an empty sound conveying the requested format
91: */
92: {
93: if (!newSound)
94: newSound = [[Sound alloc] init];
95: [newSound setDataSize:sizeof(SNDCompressionSubheader)
96: /* Conceptually, dataSize is 0 above. However,
97: if the new format is COMPRESSED a "subheader"
98: containing compression parameters is required, and
99: for historical reasons, the subheader is counted
100: as data for allocation purposes. */
101: dataFormat:newDataFormat
102: samplingRate:newSamplingRate
103: channelCount:newChannelCount
104: infoSize:0];
105: return newSound;
106: }
107:
108: - setSound:nSound
109: {
110: double samplingRate;
111: int channelCount;
112: int dataFormat;
113: int format_row;
114: int srate_row;
115: int size;
116:
117: sound = nSound;
118:
119: newSamplingRate = samplingRate = [sound samplingRate];
120: newChannelCount = channelCount = [sound channelCount];
121: newDataFormat = dataFormat = [sound dataFormat];
122: size = [sound dataSize];
123:
124: format_row = _dataFormatToRow(dataFormat);
125: srate_row = _samplingRateToRow(samplingRate);
126:
127: [newChnMtx selectCellAt:channelCount-1:0];
128: [newFmtMtx selectCellAt:format_row:0];
129: [newFsMtx selectCellAt:srate_row:0];
130:
131: return self;
132: }
133:
134: - revert:sender
135: {
136: [self setSound:sound];
137: return self;
138: }
139:
140: - setNewChn:sender
141: {
142: newChannelCount = 1+[sender selectedRow];
143: return self;
144: }
145:
146: - setNewFmt:sender
147: {
148: newDataFormat = _rowToDataFormat([sender selectedRow]);
149: return self;
150: }
151:
152: - setNewFs:sender
153: {
154: newSamplingRate = _rowToSamplingRate([sender selectedRow]);
155: return self;
156: }
157:
158: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.