diff options
Diffstat (limited to 'src/rhd_audio.c')
-rw-r--r-- | src/rhd_audio.c | 32 |
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 | */ |
96 | static Bool | 97 | static Bool |
97 | AudioPlaying(struct rhdAudio* Audio) | 98 | AudioPlaying(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 | |||
124 | AudioUpdateHdmi(OsTimerPtr timer, CARD32 time, pointer ptr) | 126 | AudioUpdateHdmi(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; |