source: roaraudio/roard/loop.c @ 5381:430b1d26e12d

Last change on this file since 5381:430b1d26e12d was 5381:430b1d26e12d, checked in by phi, 12 years ago

updated copyright years

File size: 4.9 KB
Line 
1//loop.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2012
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, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include "roard.h"
27
28int main_loop (struct roar_audio_info * sa, int sysclocksync) {
29 void ** streams_input = NULL;
30 int     term = 0;
31 int     streams;
32#ifdef ROAR_HAVE_GETTIMEOFDAY
33 long int loopc = 0;
34 struct timeval         try, ans;
35 float  freq;
36#endif
37#ifdef ROAR_SUPPORT_LISTEN
38 int i;
39 int have_listen;
40#endif
41#ifdef MONITOR_LATENCY
42 long int ans_1last = 0, ans_2last = 0, ans_3last = 0;
43
44 printf("\n\e[s");
45 fflush(stdout);
46#endif
47
48 ROAR_DBG("main_loop(*) = ?");
49// alive = 1;
50 g_pos = 0;
51
52#ifdef ROAR_HAVE_GETTIMEOFDAY
53 if ( sysclocksync ) {
54  gettimeofday(&try, NULL);
55 }
56#endif
57
58 while (alive) {
59#if defined(MONITOR_LATENCY) && defined(ROAR_HAVE_GETTIMEOFDAY)
60 gettimeofday(&try, NULL);
61#endif
62
63  ROAR_DBG("main_loop(*): looping...");
64
65#ifdef ROAR_SUPPORT_LISTEN
66  have_listen = 0;
67  for (i = 0; i < ROAR_MAX_LISTEN_SOCKETS; i++) {
68   if ( g_listen[i].used ) {
69    have_listen = 1;
70    break;
71   }
72  }
73
74  if ( have_listen ) {
75   ROAR_DBG("main_loop(*): check for new clients...");
76   net_check_listen();
77  }
78#endif
79
80  ROAR_DBG("main_loop(*): check for new data...");
81#ifdef ROAR_SUPPORT_LISTEN
82  if ( clients_check_all() == 0 && g_terminate && !have_listen ) {
83#else
84  if ( clients_check_all() == 0 && g_terminate ) {
85#endif
86   term  = 1;
87  }
88
89#ifndef ROAR_WITHOUT_DCOMP_MIDI
90  ROAR_DBG("main_loop(*): updating midi subsystem...");
91  midi_update();
92#endif
93
94  if ( waveform_update_inputs() == -1 )
95   alive = 0;
96
97  ROAR_DBG("main_loop(*): mixing clients...");
98  if ( g_standby ) {
99   // while in standby we still neet to get the buffers to free input buffer space.
100   streams = streams_get_mixbuffers(&streams_input, sa, g_pos);
101  } else {
102   if ( ( streams = streams_get_mixbuffers(&streams_input, sa, g_pos)) != -1 ) {
103    roar_mix_pcm(g_output_buffer, sa->bits, streams_input, ROAR_OUTPUT_BUFFER_SAMPLES * sa->channels);
104   }
105  }
106
107  if ( term && streams < 1 )
108   alive = 0;
109
110  if ( waveform_update_mixer() == -1 )
111   alive = 0;
112
113/*
114  // while in standby we still need to write out our buffer to not run in an endless loop without
115  // a break
116*/
117
118  if ( plugins_update() == -1 )
119   alive = 0;
120
121  ROAR_DBG("main_loop(*): sending output data...");
122
123#ifdef ROAR_HAVE_USLEEP
124  if ( g_standby || (streams < 1 && g_autostandby) ) {
125   roar_usleep(((uint_least32_t)1000000 * ROAR_OUTPUT_BUFFER_SAMPLES) / sa->rate);
126   ROAR_DBG("usleep(%u) = ?\n", (1000000 * ROAR_OUTPUT_BUFFER_SAMPLES) / sa->rate);
127  } else {
128#endif
129   clients_send_filter(sa, g_pos);
130//   streams_send_filter_all(); // this currently results in deadlocks.
131   clients_send_mon(sa, g_pos);
132#ifdef ROAR_HAVE_USLEEP
133  }
134#endif
135
136#ifndef ROAR_WITHOUT_DCOMP_MIDI
137  midi_reinit();
138#endif
139#ifndef ROAR_WITHOUT_DCOMP_SSYNTH
140  ssynth_update();
141#endif
142#ifndef ROAR_WITHOUT_DCOMP_LIGHT
143  light_reinit();
144#endif
145
146//  output_buffer_reinit();
147
148  g_pos = ROAR_MATH_OVERFLOW_ADD(g_pos, ROAR_OUTPUT_BUFFER_SAMPLES*g_sa->channels);
149  ROAR_DBG("main_loop(*): current pos: %u", g_pos);
150#if defined(MONITOR_LATENCY) && defined(ROAR_HAVE_GETTIMEOFDAY)
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 if ( loopc % 128 ) {
160  printf("\e[ucurrent latency: %.3fms  average: %.3fms   ",  ans.tv_usec                               / (double)1000,
161                                                            (ans.tv_usec+ans_3last+ans_2last+ans_1last)/ (double)4000);
162  fflush(stdout);
163 }
164
165 ans_3last = ans_2last;
166 ans_2last = ans_1last;
167 ans_1last = ans.tv_usec;
168#endif
169
170#ifdef ROAR_HAVE_GETTIMEOFDAY
171  if ( sysclocksync && !(loopc % sysclocksync) ) {
172   gettimeofday(&ans, NULL);
173
174   while (ans.tv_sec > try.tv_sec) {
175    ans.tv_sec--;
176    ans.tv_usec += 1000000;
177   }
178   ans.tv_usec -= try.tv_usec;
179
180
181   freq = (sysclocksync * ROAR_OUTPUT_BUFFER_SAMPLES) / (ans.tv_usec / 1e6);
182   printf("SYNC: f_conf=%iHz, f_real=%.2fHz diff=%+.3f%%\n", sa->rate, freq, 100*(freq/sa->rate - 1));
183
184//   memcpy(&try, &ans, sizeof(try));
185   gettimeofday(&try, NULL);
186  }
187
188  if ( sysclocksync )
189   loopc++;
190#endif
191 }
192
193 return -1;
194}
195
196//ll
Note: See TracBrowser for help on using the repository browser.