summaryrefslogtreecommitdiff
path: root/src/rhd_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhd_audio.c')
-rw-r--r--src/rhd_audio.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/rhd_audio.c b/src/rhd_audio.c
index de5f5ce..5e3c4e2 100644
--- a/src/rhd_audio.c
+++ b/src/rhd_audio.c
@@ -90,14 +90,16 @@ AudioRate(struct rhdAudio* Audio)
90 return result; 90 return result;
91} 91}
92 92
93#if 0
93/* 94/*
94 * something playing ? 95 * something playing ? (not used anymore)
95 */ 96 */
96static Bool 97static Bool
97AudioPlaying(struct rhdAudio* Audio) 98AudioPlaying(struct rhdAudio* Audio)
98{ 99{
99 return (RHDRegRead(Audio, AUDIO_PLAYING) >> 4) & 1; 100 return (RHDRegRead(Audio, AUDIO_PLAYING) >> 4) & 1;
100} 101}
102#endif
101 103
102/* 104/*
103 * iec 60958 status bits 105 * iec 60958 status bits
@@ -124,35 +126,36 @@ static CARD32
124AudioUpdateHdmi(OsTimerPtr timer, CARD32 time, pointer ptr) 126AudioUpdateHdmi(OsTimerPtr timer, CARD32 time, pointer ptr)
125{ 127{
126 struct rhdAudio *Audio = (struct rhdAudio*)ptr; 128 struct rhdAudio *Audio = (struct rhdAudio*)ptr;
127 Bool playing = AudioPlaying(Audio);
128 int channels = AudioChannels(Audio); 129 int channels = AudioChannels(Audio);
129 int rate = AudioRate(Audio); 130 int rate = AudioRate(Audio);
130 int bps = AudioBitsPerSample(Audio); 131 int bps = AudioBitsPerSample(Audio);
131 CARD8 status_bits = AudioStatusBits(Audio); 132 CARD8 status_bits = AudioStatusBits(Audio);
132 CARD8 category_code = AudioCategoryCode(Audio); 133 CARD8 category_code = AudioCategoryCode(Audio);
133 134
135 Bool changes = FALSE;
136
134 struct rhdHdmi* hdmi; 137 struct rhdHdmi* hdmi;
135 138
136 if(playing != Audio->SavedPlaying || 139 changes |= channels != Audio->SavedChannels;
137 channels != Audio->SavedChannels || 140 changes |= rate != Audio->SavedRate;
138 rate != Audio->SavedRate || 141 changes |= bps != Audio->SavedBitsPerSample;
139 bps != Audio->SavedBitsPerSample || 142 changes |= status_bits != Audio->SavedStatusBits;
140 status_bits != Audio->SavedStatusBits || 143 changes |= category_code != Audio->SavedCategoryCode;
141 category_code != Audio->SavedCategoryCode) {
142 144
143 Audio->SavedPlaying = playing; 145 if(changes) {
144 Audio->SavedChannels = channels; 146 Audio->SavedChannels = channels;
145 Audio->SavedRate = rate; 147 Audio->SavedRate = rate;
146 Audio->SavedBitsPerSample = bps; 148 Audio->SavedBitsPerSample = bps;
147 Audio->SavedStatusBits = status_bits; 149 Audio->SavedStatusBits = status_bits;
148 Audio->SavedCategoryCode = category_code; 150 Audio->SavedCategoryCode = category_code;
151 }
149 152
150 for(hdmi=Audio->Registered; hdmi != NULL; hdmi=hdmi->Next) 153 for(hdmi=Audio->Registered; hdmi != NULL; hdmi=hdmi->Next)
154 if(changes || RHDHdmiBufferStatusChanged(hdmi))
151 RHDHdmiUpdateAudioSettings( 155 RHDHdmiUpdateAudioSettings(
152 hdmi, playing, channels, 156 hdmi, channels,
153 rate, bps, status_bits, 157 rate, bps, status_bits,
154 category_code); 158 category_code);
155 }
156 159
157 return AUDIO_TIMER_INTERVALL; 160 return AUDIO_TIMER_INTERVALL;
158} 161}
@@ -303,6 +306,9 @@ RHDAudioRegisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi)
303 if(!rhdHdmi) 306 if(!rhdHdmi)
304 return; 307 return;
305 308
309 /* make shure the HDMI interface is not registered */
310 RHDAudioUnregisterHdmi(rhdPtr, rhdHdmi);
311
306 rhdHdmi->Next = Audio->Registered; 312 rhdHdmi->Next = Audio->Registered;
307 Audio->Registered = rhdHdmi; 313 Audio->Registered = rhdHdmi;
308} 314}
@@ -318,7 +324,7 @@ void RHDAudioUnregisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi)
318 if (!Audio) return; 324 if (!Audio) return;
319 RHDFUNC(Audio); 325 RHDFUNC(Audio);
320 326
321 for(hdmiPtr=&Audio->Registered; hdmiPtr!=NULL;hdmiPtr=&(*hdmiPtr)->Next) 327 for(hdmiPtr=&Audio->Registered; *hdmiPtr!=NULL;hdmiPtr=&(*hdmiPtr)->Next)
322 if(*hdmiPtr == rhdHdmi) { 328 if(*hdmiPtr == rhdHdmi) {
323 *hdmiPtr = rhdHdmi->Next; 329 *hdmiPtr = rhdHdmi->Next;
324 rhdHdmi->Next = NULL; 330 rhdHdmi->Next = NULL;