Lines Matching defs:mtc
87 struct mtc mtc_array[1] = {
191 mtc_midi_qfr(struct mtc *mtc, int delta)
197 mtc->delta += delta * MTC_SEC;
198 qfrlen = mtc->dev->rate * (MTC_SEC / (4 * mtc->fps));
199 while (mtc->delta >= qfrlen) {
200 switch (mtc->qfr) {
202 data = mtc->fr & 0xf;
205 data = mtc->fr >> 4;
208 data = mtc->sec & 0xf;
211 data = mtc->sec >> 4;
214 data = mtc->min & 0xf;
217 data = mtc->min >> 4;
220 data = mtc->hr & 0xf;
223 data = (mtc->hr >> 4) | (mtc->fps_id << 1);
227 mtc->fr += 2;
228 if (mtc->fr < mtc->fps)
230 mtc->fr -= mtc->fps;
231 mtc->sec++;
232 if (mtc->sec < 60)
234 mtc->sec = 0;
235 mtc->min++;
236 if (mtc->min < 60)
238 mtc->min = 0;
239 mtc->hr++;
240 if (mtc->hr < 24)
242 mtc->hr = 0;
249 buf[1] = (mtc->qfr << 4) | data;
250 mtc->qfr++;
251 mtc->qfr &= 7;
252 dev_midi_send(mtc->dev, buf, 2);
253 mtc->delta -= qfrlen;
261 mtc_midi_full(struct mtc *mtc)
266 mtc->delta = -MTC_SEC * (int)mtc->dev->bufsz;
267 if (mtc->dev->rate % (30 * 4 * mtc->dev->round) == 0) {
268 mtc->fps_id = MTC_FPS_30;
269 mtc->fps = 30;
270 } else if (mtc->dev->rate % (25 * 4 * mtc->dev->round) == 0) {
271 mtc->fps_id = MTC_FPS_25;
272 mtc->fps = 25;
274 mtc->fps_id = MTC_FPS_24;
275 mtc->fps = 24;
278 logx(3, "%s: mtc full frame at %d, %d fps", mtc->dev->path, mtc->delta, mtc->fps);
280 fps = mtc->fps;
281 mtc->hr = (mtc->origin / (MTC_SEC * 3600)) % 24;
282 mtc->min = (mtc->origin / (MTC_SEC * 60)) % 60;
283 mtc->sec = (mtc->origin / (MTC_SEC)) % 60;
284 mtc->fr = (mtc->origin / (MTC_SEC / fps)) % fps;
291 x.u.full.hr = mtc->hr | (mtc->fps_id << 5);
292 x.u.full.min = mtc->min;
293 x.u.full.sec = mtc->sec;
294 x.u.full.fr = mtc->fr;
296 mtc->qfr = 0;
297 dev_midi_send(mtc->dev, (unsigned char *)&x, SYSEX_SIZE(full));
1270 mtc_trigger(struct mtc *mtc)
1275 if (mtc->tstate != MTC_START) {
1276 logx(2, "%s: not started by mmc yet, waiting.", mtc->dev->path);
1281 if (s->opt == NULL || s->opt->mtc != mtc)
1290 if (!dev_ref(mtc->dev))
1294 if (s->opt == NULL || s->opt->mtc != mtc)
1299 mtc->tstate = MTC_RUN;
1300 mtc_midi_full(mtc);
1301 dev_wakeup(mtc->dev);
1308 mtc_start(struct mtc *mtc)
1310 if (mtc->tstate == MTC_STOP) {
1311 mtc->tstate = MTC_START;
1312 mtc_trigger(mtc);
1315 logx(3, "%s: ignoring mmc start", mtc->dev->path);
1324 mtc_stop(struct mtc *mtc)
1326 switch (mtc->tstate) {
1328 mtc->tstate = MTC_STOP;
1331 mtc->tstate = MTC_STOP;
1332 dev_unref(mtc->dev);
1336 logx(3, "%s: ignored mmc stop", mtc->dev->path);
1346 mtc_loc(struct mtc *mtc, unsigned int origin)
1348 logx(2, "%s: relocated to %u", mtc->dev->path, origin);
1350 if (mtc->tstate == MTC_RUN)
1351 mtc_stop(mtc);
1352 mtc->origin = origin;
1353 if (mtc->tstate == MTC_RUN)
1354 mtc_start(mtc);
1361 mtc_setdev(struct mtc *mtc, struct dev *d)
1365 if (mtc->dev == d)
1371 if (mtc->tstate == MTC_RUN) {
1372 mtc->delta -= mtc->dev->delta;
1373 dev_unref(mtc->dev);
1376 mtc->dev = d;
1378 if (mtc->tstate == MTC_RUN) {
1379 mtc->delta += mtc->dev->delta;
1380 dev_ref(mtc->dev);
1381 dev_wakeup(mtc->dev);
1386 if (o->mtc == mtc)
1387 opt_setdev(o, mtc->dev);
1631 s->xrun = s->opt->mtc != NULL ? XRUN_SYNC : XRUN_IGNORE;
1799 if (s->opt->mtc == NULL) {
1803 mtc_trigger(s->opt->mtc);