@@ -87,40 +87,62 @@ private void initializeOnceBridgeOnline(FreeboxOsHandler bridgeHandler) {
87
87
Map <String , String > properties = editProperties ();
88
88
try {
89
89
initializeProperties (properties );
90
- checkAirMediaCapabilities (properties );
91
90
updateProperties (properties );
92
91
} catch (FreeboxException e ) {
93
92
logger .warn ("Error getting thing {} properties: {}" , thing .getUID (), e .getMessage ());
94
93
}
95
94
96
- boolean isAudioReceiver = Boolean .parseBoolean (properties .get (MediaType .AUDIO .name ()));
97
- if (isAudioReceiver ) {
98
- configureMediaSink (bridgeHandler , properties .getOrDefault (Source .UPNP .name (), "" ));
99
- }
100
-
101
95
startRefreshJob ();
102
96
}
103
97
104
- private void configureMediaSink (FreeboxOsHandler bridgeHandler , String upnpName ) {
98
+ protected void configureMediaSink () {
105
99
try {
100
+ String upnpName = editProperties ().getOrDefault (Source .UPNP .name (), "" );
106
101
Receiver receiver = getManager (MediaReceiverManager .class ).getReceiver (upnpName );
107
- if (receiver != null && reg == null ) {
108
- ApiConsumerConfiguration config = getConfig ().as (ApiConsumerConfiguration .class );
109
- String callbackURL = bridgeHandler .getCallbackURL ();
110
- if (!config .password .isEmpty () || !receiver .passwordProtected ()) {
111
- reg = bridgeHandler .getBundleContext ().registerService (
112
- AudioSink .class .getName (), new AirMediaSink (this , bridgeHandler .getAudioHTTPServer (),
113
- callbackURL , receiver .name (), config .password , config .acceptAllMp3 ),
114
- new Hashtable <>());
115
- } else {
116
- logger .info ("A password needs to be configured to enable Air Media capability." );
117
- }
102
+ if (receiver != null ) {
103
+ Map <String , String > properties = editProperties ();
104
+ receiver .capabilities ().entrySet ()
105
+ .forEach (entry -> properties .put (entry .getKey ().name (), entry .getValue ().toString ()));
106
+ updateProperties (properties );
107
+
108
+ startAudioSink (receiver );
109
+ } else {
110
+ stopAudioSink ();
118
111
}
119
112
} catch (FreeboxException e ) {
120
113
logger .warn ("Unable to retrieve Media Receivers: {}" , e .getMessage ());
121
114
}
122
115
}
123
116
117
+ private void startAudioSink (Receiver receiver ) {
118
+ FreeboxOsHandler bridgeHandler = checkBridgeHandler ();
119
+ // Only video and photo is supported by the API so use VIDEO capability for audio
120
+ Boolean isAudioReceiver = receiver .capabilities ().get (MediaType .VIDEO );
121
+ if (reg == null && bridgeHandler != null && isAudioReceiver != null && isAudioReceiver .booleanValue ()) {
122
+ ApiConsumerConfiguration config = getConfig ().as (ApiConsumerConfiguration .class );
123
+ String callbackURL = bridgeHandler .getCallbackURL ();
124
+ if (!config .password .isEmpty () || !receiver .passwordProtected ()) {
125
+ reg = bridgeHandler .getBundleContext ()
126
+ .registerService (
127
+ AudioSink .class .getName (), new AirMediaSink (this , bridgeHandler .getAudioHTTPServer (),
128
+ callbackURL , receiver .name (), config .password , config .acceptAllMp3 ),
129
+ new Hashtable <>());
130
+ logger .debug ("Audio sink registered for {}." , receiver .name ());
131
+ } else {
132
+ logger .warn ("A password needs to be configured to enable Air Media capability." );
133
+ }
134
+ }
135
+ }
136
+
137
+ private void stopAudioSink () {
138
+ ServiceRegistration <?> localReg = reg ;
139
+ if (localReg != null ) {
140
+ localReg .unregister ();
141
+ logger .debug ("Audio sink unregistered" );
142
+ reg = null ;
143
+ }
144
+ }
145
+
124
146
public <T extends RestManager > T getManager (Class <T > clazz ) throws FreeboxException {
125
147
FreeboxOsHandler handler = checkBridgeHandler ();
126
148
if (handler != null ) {
@@ -159,15 +181,6 @@ public void handleCommand(ChannelUID channelUID, Command command) {
159
181
}
160
182
}
161
183
162
- private void checkAirMediaCapabilities (Map <String , String > properties ) throws FreeboxException {
163
- String upnpName = properties .getOrDefault (Source .UPNP .name (), "" );
164
- Receiver receiver = getManager (MediaReceiverManager .class ).getReceiver (upnpName );
165
- if (receiver != null ) {
166
- receiver .capabilities ().entrySet ()
167
- .forEach (entry -> properties .put (entry .getKey ().name (), entry .getValue ().toString ()));
168
- }
169
- }
170
-
171
184
private @ Nullable FreeboxOsHandler checkBridgeHandler () {
172
185
Bridge bridge = getBridge ();
173
186
if (bridge != null ) {
@@ -192,10 +205,7 @@ private void checkAirMediaCapabilities(Map<String, String> properties) throws Fr
192
205
@ Override
193
206
public void dispose () {
194
207
stopJobs ();
195
- ServiceRegistration <?> localReg = reg ;
196
- if (localReg != null ) {
197
- localReg .unregister ();
198
- }
208
+ stopAudioSink ();
199
209
super .dispose ();
200
210
}
201
211
0 commit comments