200 | | /* |
---|
201 | | Implement the procedure to set the samplerate here |
---|
202 | | */ |
---|
203 | | |
---|
204 | | quadlet_t new_rate=0; |
---|
205 | | int supported=true; |
---|
206 | | |
---|
207 | | switch ( samplingFrequency ) { |
---|
208 | | case eSF_22050Hz: |
---|
209 | | supported=false; |
---|
210 | | break; |
---|
211 | | case eSF_24000Hz: |
---|
212 | | supported=false; |
---|
213 | | break; |
---|
214 | | case eSF_32000Hz: |
---|
215 | | supported=false; |
---|
216 | | break; |
---|
217 | | case eSF_44100Hz: |
---|
218 | | new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_1X; |
---|
219 | | break; |
---|
220 | | case eSF_48000Hz: |
---|
221 | | new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_1X; |
---|
222 | | break; |
---|
223 | | case eSF_88200Hz: |
---|
224 | | new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_2X; |
---|
225 | | break; |
---|
226 | | case eSF_96000Hz: |
---|
227 | | new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_2X; |
---|
228 | | break; |
---|
229 | | case eSF_176400Hz: |
---|
230 | | new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_4X; |
---|
231 | | break; |
---|
232 | | case eSF_192000Hz: |
---|
233 | | new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_4X; |
---|
234 | | break; |
---|
235 | | default: |
---|
236 | | supported=false; |
---|
237 | | } |
---|
238 | | |
---|
239 | | // update the register. FIXME: there's more to it than this |
---|
240 | | if (supported) { |
---|
241 | | quadlet_t value=ReadRegister(MOTUFW_REG_RATECTRL); |
---|
242 | | value &= ~(MOTUFW_BASE_RATE_MASK|MOTUFW_RATE_MULTIPLIER_MASK); |
---|
243 | | value |= new_rate; |
---|
| 200 | /* |
---|
| 201 | * Set the device samplerate. |
---|
| 202 | */ |
---|
| 203 | char *src_name; |
---|
| 204 | quadlet_t q, new_rate=0; |
---|
| 205 | int i, supported=true; |
---|
| 206 | |
---|
| 207 | switch ( samplingFrequency ) { |
---|
| 208 | case eSF_22050Hz: |
---|
| 209 | supported=false; |
---|
| 210 | break; |
---|
| 211 | case eSF_24000Hz: |
---|
| 212 | supported=false; |
---|
| 213 | break; |
---|
| 214 | case eSF_32000Hz: |
---|
| 215 | supported=false; |
---|
| 216 | break; |
---|
| 217 | case eSF_44100Hz: |
---|
| 218 | new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_1X; |
---|
| 219 | break; |
---|
| 220 | case eSF_48000Hz: |
---|
| 221 | new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_1X; |
---|
| 222 | break; |
---|
| 223 | case eSF_88200Hz: |
---|
| 224 | new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_2X; |
---|
| 225 | break; |
---|
| 226 | case eSF_96000Hz: |
---|
| 227 | new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_2X; |
---|
| 228 | break; |
---|
| 229 | case eSF_176400Hz: |
---|
| 230 | new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_4X; |
---|
| 231 | break; |
---|
| 232 | case eSF_192000Hz: |
---|
| 233 | new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_4X; |
---|
| 234 | break; |
---|
| 235 | default: |
---|
| 236 | supported=false; |
---|
| 237 | } |
---|
| 238 | |
---|
| 239 | // Update the clock control register. FIXME: there's more to it than this |
---|
| 240 | if (supported) { |
---|
| 241 | quadlet_t value=ReadRegister(MOTUFW_REG_RATECTRL); |
---|
| 242 | value &= ~(MOTUFW_RATE_BASE_MASK|MOTUFW_RATE_MULTIPLIER_MASK); |
---|
| 243 | value |= new_rate; |
---|
245 | | if (WriteRegister(MOTUFW_REG_RATECTRL, value) == 0) { |
---|
246 | | supported=true; |
---|
247 | | } else { |
---|
248 | | supported=false; |
---|
249 | | } |
---|
250 | | } |
---|
251 | | return supported; |
---|
| 245 | if (WriteRegister(MOTUFW_REG_RATECTRL, value) == 0) { |
---|
| 246 | supported=true; |
---|
| 247 | } else { |
---|
| 248 | supported=false; |
---|
| 249 | } |
---|
| 250 | // A write to the rate/clock control register requires the |
---|
| 251 | // textual name of the current clock source be sent to the |
---|
| 252 | // clock source name registers. |
---|
| 253 | switch (value & MOTUFW_CLKSRC_MASK) { |
---|
| 254 | case MOTUFW_CLKSRC_INTERNAL: |
---|
| 255 | src_name = "Internal "; |
---|
| 256 | break; |
---|
| 257 | case MOTUFW_CLKSRC_ADAT_OPTICAL: |
---|
| 258 | src_name = "ADAT Optical "; |
---|
| 259 | break; |
---|
| 260 | case MOTUFW_CLKSRC_SPDIF_TOSLINK: |
---|
| 261 | src_name = "SPDIF/TOSLink "; |
---|
| 262 | break; |
---|
| 263 | case MOTUFW_CLKSRC_SMTPE: |
---|
| 264 | src_name = "SMPTE "; |
---|
| 265 | break; |
---|
| 266 | case MOTUFW_CLKSRC_WORDCLOCK: |
---|
| 267 | src_name = "Word Clock In "; |
---|
| 268 | break; |
---|
| 269 | case MOTUFW_CLKSRC_ADAT_9PIN: |
---|
| 270 | src_name = "ADAT 9-pin "; |
---|
| 271 | break; |
---|
| 272 | case MOTUFW_CLKSRC_AES_EBU: |
---|
| 273 | src_name = "AES-EBU "; |
---|
| 274 | break; |
---|
| 275 | default: |
---|
| 276 | src_name = "Unknown "; |
---|
| 277 | } |
---|
| 278 | for (i=0; i<16; i+=4) { |
---|
| 279 | q = (src_name[i]<<24) | (src_name[i+1]<<16) | |
---|
| 280 | (src_name[i+2]<<8) | src_name[i+3]; |
---|
| 281 | WriteRegister(MOTUFW_REG_CLKSRC_NAME0+i, q); |
---|
| 282 | } |
---|
| 283 | } |
---|
| 284 | return supported; |
---|