J'écris des liaisons C# pour la bibliothèque C contrôlant le serveur de sons pulseaudio, et je ne sais pas comment lier idiomatiquement certains objets potentiellement passifs exposés: en particulier les puits. Pulseaudio a le concept d'un évier audio - le matériel auquel un flux audio donné est joué. Cela se mapperait naturellement à une classe Sink
, avec des propriétés évidentes - volume et autres. Le problème est hotplug - le matériel audio peut aller et venir pendant l'exécution, et donc de tels objets Sink
peuvent finir comme des zombies faisant référence à du matériel inexistant, et toutes les opérations effectuées sur eux échoueront. Pire encore, la bibliothèque C n'offre pas de poignées uniques aux récepteurs, donc une séquence d'événements hotplug pourrait changer le matériel qu'une instance Sink
donnée contrôle réellement sans que le code ne s'en aperçoive.Une façon idiomatique d'envelopper un objet potentiellement transitoire
Ces deux problèmes sentent. Je veux fournir une abstraction de Sink
, mais je ne sais pas comment éviter ces problèmes.
Comment d'autres personnes dans une situation similaire ont-elles géré ce genre de problème? Dans la bibliothèque C, il semble que vous n'espérez aucun événement hotplug entre l'interrogation des récepteurs et la modification de leurs propriétés. Les puits sont identifiés dans l'API par un index, mais ce n'est pas stable. Chaque puits a aussi une chaîne d'identifiant qui est, je pense, unique, au moins pour chaque cycle.
Il existe une API pour obtenir des rappels sur divers événements intéressants, tels que hotplug, de sorte qu'il serait possible de connecter chaque Sink
à cela et au moins être averti quand il s'en ira.
Comment c gère-t-il cette situation? Est-ce que vous simplement requery pour l'évier chaque fois que vous en avez besoin? – JeffreyABecker
Cela ressemble à un problème vraiment délicat. Je ne peux que penser (hors de ma tête) de sondage. Certainement pas une solution élégante. –