source: roaraudio/roard/loop.c @ 2500:5e481907a8c0

Last change on this file since 2500:5e481907a8c0 was 2500:5e481907a8c0, checked in by phi, 15 years ago

support to disable MIDI subsystem completly

File size: 4.5 KB
Line 
1//loop.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008
5 *
6 *  This file is part of roard a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  RoarAudio is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 */
24
25#include "roard.h"
26
27int main_loop (int driver, DRIVER_USERDATA_T driver_inst, struct roar_audio_info * sa, int sysclocksync) {
28 void ** streams_input = NULL;
29 int     term = 0;
30 int     streams;
31#ifdef ROAR_HAVE_GETTIMEOFDAY
32 long int loopc = 0;
33 struct timeval         try, ans;
34 float  freq;
35#endif
36#ifdef MONITOR_LATENCY
37 long int ans_1last = 0, ans_2last = 0, ans_3last = 0;
38
39 printf("\n\e[s");
40 fflush(stdout);
41#endif
42
43 ROAR_DBG("main_loop(*) = ?");
44// alive = 1;
45 g_pos = 0;
46
47#ifdef ROAR_HAVE_GETTIMEOFDAY
48 if ( sysclocksync ) {
49  gettimeofday(&try, NULL);
50 }
51#endif
52
53 while (alive) {
54#if defined(MONITOR_LATENCY) && defined(ROAR_HAVE_GETTIMEOFDAY)
55 gettimeofday(&try, NULL);
56#endif
57
58  ROAR_DBG("main_loop(*): looping...");
59
60#ifdef ROAR_SUPPORT_LISTEN
61  if ( g_listen_socket != -1 ) {
62   ROAR_DBG("main_loop(*): check for new clients...");
63   net_check_listen();
64  }
65#endif
66
67  ROAR_DBG("main_loop(*): check for new data...");
68#ifdef ROAR_SUPPORT_LISTEN
69  if ( clients_check_all() == 0 && g_terminate && g_listen_socket == -1 ) {
70#else
71  if ( clients_check_all() == 0 && g_terminate ) {
72#endif
73   term  = 1;
74  }
75
76#ifndef ROAR_WITHOUT_DCOMP_MIDI
77  ROAR_DBG("main_loop(*): updating midi subsystem...");
78  midi_update();
79#endif
80
81  ROAR_DBG("main_loop(*): mixing clients...");
82  if ( g_standby ) {
83   // while in standby we still neet to get the buffers to free input buffer space.
84   streams = streams_get_mixbuffers(&streams_input, sa, g_pos);
85  } else {
86   if ( ( streams = streams_get_mixbuffers(&streams_input, sa, g_pos)) != -1 ) {
87    mix_clients(g_output_buffer, sa->bits, streams_input, ROAR_OUTPUT_BUFFER_SAMPLES * sa->channels);
88   }
89  }
90
91  if ( term && streams < 1 )
92   alive = 0;
93
94/*
95  // while in standby we still need to write out our buffer to not run in an endless loop without
96  // a break
97*/
98
99
100  ROAR_DBG("main_loop(*): sending output data...");
101
102#ifdef ROAR_HAVE_USLEEP
103  if ( g_standby || (streams < 1 && g_autostandby) ) {
104   usleep((1000000 * ROAR_OUTPUT_BUFFER_SAMPLES) / sa->rate);
105   ROAR_DBG("usleep(%u) = ?\n", (1000000 * ROAR_OUTPUT_BUFFER_SAMPLES) / sa->rate);
106  } else {
107#endif
108   clients_send_filter(sa, g_pos);
109   output_buffer_flush(driver_inst, driver);
110   clients_send_mon(sa, g_pos);
111#ifdef ROAR_HAVE_USLEEP
112  }
113#endif
114
115#ifndef ROAR_WITHOUT_DCOMP_MIDI
116  midi_reinit();
117#endif
118#ifndef ROAR_WITHOUT_DCOMP_SSYNTH
119  ssynth_update();
120#endif
121#ifndef ROAR_WITHOUT_DCOMP_LIGHT
122  light_reinit();
123#endif
124
125//  output_buffer_reinit();
126
127  g_pos = ROAR_MATH_OVERFLOW_ADD(g_pos, ROAR_OUTPUT_BUFFER_SAMPLES*g_sa->channels);
128  ROAR_DBG("main_loop(*): current pos: %u", g_pos);
129#if defined(MONITOR_LATENCY) && defined(ROAR_HAVE_GETTIMEOFDAY)
130 gettimeofday(&ans, NULL);
131
132 while (ans.tv_sec > try.tv_sec) {
133  ans.tv_sec--;
134  ans.tv_usec += 1000000;
135 }
136 ans.tv_usec -= try.tv_usec;
137
138 if ( loopc % 128 ) {
139  printf("\e[ucurrent latency: %.3fms  average: %.3fms   ",  ans.tv_usec                               / (double)1000,
140                                                            (ans.tv_usec+ans_3last+ans_2last+ans_1last)/ (double)4000);
141  fflush(stdout);
142 }
143
144 ans_3last = ans_2last;
145 ans_2last = ans_1last;
146 ans_1last = ans.tv_usec;
147#endif
148
149#ifdef ROAR_HAVE_GETTIMEOFDAY
150  if ( sysclocksync && !(loopc % sysclocksync) ) {
151   gettimeofday(&ans, NULL);
152
153   while (ans.tv_sec > try.tv_sec) {
154    ans.tv_sec--;
155    ans.tv_usec += 1000000;
156   }
157   ans.tv_usec -= try.tv_usec;
158
159
160   freq = (sysclocksync * ROAR_OUTPUT_BUFFER_SAMPLES) / (ans.tv_usec / 1e6);
161   printf("SYNC: f_conf=%iHz, f_real=%.2fHz diff=%+.3f%%\n", sa->rate, freq, 100*(freq/sa->rate - 1));
162
163//   memcpy(&try, &ans, sizeof(try));
164   gettimeofday(&try, NULL);
165  }
166
167  if ( sysclocksync )
168   loopc++;
169#endif
170 }
171
172 return -1;
173}
174
175//ll
Note: See TracBrowser for help on using the repository browser.