{"id":18289192,"url":"https://github.com/cmsj/hotmic","last_synced_at":"2025-04-09T07:16:26.631Z","repository":{"id":145773340,"uuid":"183310071","full_name":"cmsj/HotMic","owner":"cmsj","description":"This is an attempt to produce a working Play Through app for macOS. It does not currently work well (see README.md)","archived":false,"fork":false,"pushed_at":"2019-04-30T03:20:19.000Z","size":123,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-15T01:32:41.092Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cmsj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-24T21:34:36.000Z","updated_at":"2019-04-30T03:20:20.000Z","dependencies_parsed_at":"2023-04-18T06:04:48.077Z","dependency_job_id":null,"html_url":"https://github.com/cmsj/HotMic","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmsj%2FHotMic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmsj%2FHotMic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmsj%2FHotMic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmsj%2FHotMic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cmsj","download_url":"https://codeload.github.com/cmsj/HotMic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247994136,"owners_count":21030050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T14:05:08.386Z","updated_at":"2025-04-09T07:16:26.612Z","avatar_url":"https://github.com/cmsj.png","language":"C++","readme":"# HotMic\n\n## What is it?\nThis app is intended to be a functional Play Through app for macOS.\n\n## What does that mean?\nWhat is a Play Through app? It means it takes input sound from one audio device and plays it through the output of another device. A good example would be using a Line In on a USB soundcard and being able to hear it through your normal Mac speakers.\n\n## Does it work?\nNot yet, but it could, and you could help!\n\n## Why doesn't it work?\nApple provides some (very old) sample code for how to do this, in a project called CAPlayThrough, and it sort-of works, but over time the two devices lose synchronisation and the audio plays later and later until it is so late that Core Audio discards it. This seems to be a fundamental flaw in the VariSpeed Audio Unit and appears uncorrectable.\n\n## Are you sure this is possible?\nYes, the fine folk over at Rogue Amoeba have been able to produce three perfectly stable apps that offer a Play Through feature, at one time or another (LineIn, SoundSource (prior to v4) and Audio Hijack). Others have tried, but I'm not aware of any that have succeded, likely because most seem to have started from CAPlayThrough, as I did.\n\n## So how should this be fixed?\nFrom what I've been able to learn by reading old posts on Apple's coreaudio-api mailing list, at least one person wrote their own Audio Unit to replace VariSpeed, but the resource they used to learn how to do that, has long since disappeared from the Internet.\n\nThe current best sounding suggestion (thanks to Matt Ingalls) for how it might be able to work, is by creating an Aggregate audio device that contains the desired input and output audio devices, and joining them together with an AUGraph. This would mean the OS itself would keep the devices in sync. There's a separate branch in this repo which has the beginnings of an implementation of this plan (ie it can create an aggregate device with the relevant subdevices attached), but I don't understand enough about AUGraphs to implement the rest right now.\n\n## Where do we go from here?\nI don't currently plan to invest many more hours into this for now. SoundSource 3 will presumably work for some time to come, so I don't *need* HotMic to work until SoundSource is rendered broken by some future OS update.\n\nHowever, if someone comes across this and knows their way around CoreAudio a bit better than I do, I would love to collaborate with you to get this working. File Issues or Pull Requests and let's talk!\n\n## Anything else I should know?\nIf you install uncrustify, you can do ```git config core.hooksPath .githooks``` and get a pre-commit hook that beautifies your code for you.\n\n## Whose shoulders did you stand on for this?\n\nA non-exhaustive list:\n * Apple (for the CAPlayThrough example)\n * Various CAPlayThrough forks with fixes/changes:\n   * [https://github.com/liscio/CAPlayThrough](https://github.com/liscio/CAPlayThrough)\n   * [https://github.com/yujitach/CAPlayThrough](https://github.com/yujitach/CAPlayThrough)\n * Current and historical posters on coreaudio-api@lists.apple.com for their discussions about CAPlayThrough\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcmsj%2Fhotmic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcmsj%2Fhotmic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcmsj%2Fhotmic/lists"}