From ddee589865dee76a21a0af3d0e8da7078376a786 Mon Sep 17 00:00:00 2001 From: HowNeft <92006941+HowNeft@users.noreply.github.com> Date: Fri, 12 Nov 2021 01:17:51 +0700 Subject: [PATCH] Add files via upload --- ComboJack_Installer/ComboJack | Bin 0 -> 77344 bytes ComboJack_Installer/Headphone.icns | Bin 0 -> 67652 bytes ComboJack_Installer/Information.rtf | 20 + ComboJack_Installer/LICENSE | 339 ++++++ .../VerbStub.kext/Contents/Info.plist | 84 ++ .../VerbStub.kext/Contents/MacOS/VerbStub | Bin 0 -> 201664 bytes ComboJack_Installer/com.XPS.ComboJack.plist | 18 + ComboJack_Installer/hda-verb | Bin 0 -> 14920 bytes ComboJack_Installer/install.sh | 50 + ComboJack_Installer/l10n.json | 26 + ComboJack_Source/Combo Jack/PCI.h | 71 ++ ComboJack_Source/Combo Jack/PCI.m | 339 ++++++ ComboJack_Source/Combo Jack/Tables.h | 653 ++++++++++ ComboJack_Source/Combo Jack/hda-verb.m | 1047 +++++++++++++++++ ComboJack_Source/Combo Jack/hda_hwdep.h | 42 + ComboJack_Source/Combo Jack/rt298.h | 219 ++++ .../ComboJack.xcodeproj/project.pbxproj | 278 +++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 22648 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 19444 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 28990 bytes .../xcshareddata/xcschemes/ComboJack.xcscheme | 78 ++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/Combo Jack.xcscheme | 91 ++ .../xcschemes/xcschememanagement.plist | 22 + .../xcschemes/xcschememanagement.plist | 14 + .../xcschemes/xcschememanagement.plist | 22 + ComboJack_Source/Headphone.icns | Bin 0 -> 204877 bytes ComboJack_Source/LICENSE | 339 ++++++ ComboJack_Source/build.sh | 13 + ComboJack_Source/l10n.json | 42 + VerbStub_Source/LICENSE | 339 ++++++ .../VerbStub.xcodeproj/project.pbxproj | 435 +++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 108573 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 10836 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/VerbStub.xcscheme | 80 ++ .../xcschemes/hda-verb.xcscheme | 91 ++ .../xcschemes/xcschememanagement.plist | 47 + .../xcschemes/xcschememanagement.plist | 19 + VerbStub_Source/VerbStub/Info.plist | 60 + VerbStub_Source/VerbStub/IntelHDA.cpp | 429 +++++++ VerbStub_Source/VerbStub/IntelHDA.h | 318 +++++ VerbStub_Source/VerbStub/VerbStub.cpp | 315 +++++ VerbStub_Source/VerbStub/VerbStub.hpp | 115 ++ VerbStub_Source/hda-verb/hda-verb.c | 470 ++++++++ VerbStub_Source/hda-verb/hda_hwdep.h | 42 + 50 files changed, 6607 insertions(+) create mode 100644 ComboJack_Installer/ComboJack create mode 100644 ComboJack_Installer/Headphone.icns create mode 100644 ComboJack_Installer/Information.rtf create mode 100644 ComboJack_Installer/LICENSE create mode 100644 ComboJack_Installer/VerbStub.kext/Contents/Info.plist create mode 100644 ComboJack_Installer/VerbStub.kext/Contents/MacOS/VerbStub create mode 100644 ComboJack_Installer/com.XPS.ComboJack.plist create mode 100644 ComboJack_Installer/hda-verb create mode 100644 ComboJack_Installer/install.sh create mode 100644 ComboJack_Installer/l10n.json create mode 100644 ComboJack_Source/Combo Jack/PCI.h create mode 100644 ComboJack_Source/Combo Jack/PCI.m create mode 100644 ComboJack_Source/Combo Jack/Tables.h create mode 100644 ComboJack_Source/Combo Jack/hda-verb.m create mode 100644 ComboJack_Source/Combo Jack/hda_hwdep.h create mode 100644 ComboJack_Source/Combo Jack/rt298.h create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.pbxproj create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/saintno.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcshareddata/xcschemes/ComboJack.xcscheme create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/Combo Jack.xcscheme create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ComboJack_Source/ComboJack.xcodeproj/xcuserdata/saintno.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ComboJack_Source/Headphone.icns create mode 100644 ComboJack_Source/LICENSE create mode 100644 ComboJack_Source/build.sh create mode 100644 ComboJack_Source/l10n.json create mode 100644 VerbStub_Source/LICENSE create mode 100644 VerbStub_Source/VerbStub.xcodeproj/project.pbxproj create mode 100644 VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/VerbStub.xcscheme create mode 100644 VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/hda-verb.xcscheme create mode 100644 VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 VerbStub_Source/VerbStub.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 VerbStub_Source/VerbStub/Info.plist create mode 100644 VerbStub_Source/VerbStub/IntelHDA.cpp create mode 100644 VerbStub_Source/VerbStub/IntelHDA.h create mode 100644 VerbStub_Source/VerbStub/VerbStub.cpp create mode 100644 VerbStub_Source/VerbStub/VerbStub.hpp create mode 100644 VerbStub_Source/hda-verb/hda-verb.c create mode 100644 VerbStub_Source/hda-verb/hda_hwdep.h diff --git a/ComboJack_Installer/ComboJack b/ComboJack_Installer/ComboJack new file mode 100644 index 0000000000000000000000000000000000000000..d73d94f551bde5f427eb852dcdc76e27e63e6077 GIT binary patch literal 77344 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 z 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 literal 0 HcmV?d00001 diff --git a/ComboJack_Installer/Headphone.icns b/ComboJack_Installer/Headphone.icns new file mode 100644 index 0000000000000000000000000000000000000000..5d66d7b338e13be29fd1063cb0023da2281ba79c GIT binary patch literal 67652 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�X8wqvU0px+|Dmh>KrF}V$WSgKDdN8#Rm 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

U%9x{gh%;Gx|Vx{d~?NLL-5XvN0J*KV9h-; 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ℜa98e1>D1P`|Qy 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 OlZkO~XYxNA=l=^uxXhFQ literal 0 HcmV?d00001 diff --git a/ComboJack_Installer/Information.rtf b/ComboJack_Installer/Information.rtf new file mode 100644 index 0000000..73716bc --- /dev/null +++ b/ComboJack_Installer/Information.rtf @@ -0,0 +1,20 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Verdana;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red17\green90\blue209; +} +{\*\expandedcolortbl;;\cssrgb\c0\c0\c0;\cssrgb\c100000\c100000\c100000;\cssrgb\c5882\c44706\c85490; +} +\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 Modified ComboJack binary for ALC295 Dell Inspiron 7590/7591 by SaintNo\ +\ +Based on the idea of +\f1 \cf2 \cb3 \expnd0\expndtw0\kerning0 +\'a0{\field{\*\fldinst{HYPERLINK "https://github.com/goodwin/ALCPlugFix"}}{\fldrslt \cf4 \ul \ulc4 https://github.com/goodwin/ALCPlugFix}}\ +Implemented by way of porting hda-verb from alsa-tools:\ +{\field{\*\fldinst{HYPERLINK "https://www.alsa-project.org/main/index.php/Main_Page"}}{\fldrslt https://www.alsa-project.org/main/index.php/Main_Page}}\ +\ +Portions of code adapted from CodecCommander ({\field{\*\fldinst{HYPERLINK "https://github.com/RehabMan/EAPD-Codec-Commander"}}{\fldrslt https://github.com/RehabMan/EAPD-Codec-Commander}}) and the Linux kernel ({\field{\*\fldinst{HYPERLINK "https://github.com/torvalds/linux"}}{\fldrslt https://github.com/torvalds/linux}}). All copyrights belong to their respective owners.\ +\ +Uses layout-id 77. VerbStub.kext goes into EFI/Clover/kexts/Other.} \ No newline at end of file diff --git a/ComboJack_Installer/LICENSE b/ComboJack_Installer/LICENSE new file mode 100644 index 0000000..c8ee2c2 --- /dev/null +++ b/ComboJack_Installer/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + handles EAPD state updating for power-managed HDA codecs + Copyright (C) 2013 Dolnor + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ComboJack_Installer/VerbStub.kext/Contents/Info.plist b/ComboJack_Installer/VerbStub.kext/Contents/Info.plist new file mode 100644 index 0000000..43bc920 --- /dev/null +++ b/ComboJack_Installer/VerbStub.kext/Contents/Info.plist @@ -0,0 +1,84 @@ + + + + + BuildMachineOSBuild + 20D91 + CFBundleDevelopmentRegion + en + CFBundleExecutable + VerbStub + CFBundleIdentifier + com.XPS.VerbStub + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + VerbStub + CFBundlePackageType + KEXT + CFBundleShortVersionString + 1.0.4 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1.0.4 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 12D4e + DTPlatformName + macosx + DTPlatformVersion + 11.1 + DTSDKBuild + 20C63 + DTSDKName + macosx11.1 + DTXcode + 1240 + DTXcodeBuild + 12D4e + IOKitPersonalities + + VerbStub + + CFBundleIdentifier + com.XPS.VerbStub + IOClass + com_XPS_VerbStub + IOMatchCategory + com_XPS_VerbStub + IOProviderClass + IOHDACodecFunction + IOUserClientClass + VerbStubUserClient + + VerbStubResidency + + CFBundleIdentifier + com.XPS.VerbStub + IOClass + VerbStubResidency + IOMatchCategory + VerbStubResidency + IOProviderClass + IOResources + + + LSMinimumSystemVersion + 10.12 + NSHumanReadableCopyright + Copyright © 2017 VerbStub. All rights reserved. + OSBundleLibraries + + com.apple.iokit.IOPCIFamily + 2.9 + com.apple.kpi.iokit + 16.6 + com.apple.kpi.libkern + 16.6 + + + diff --git a/ComboJack_Installer/VerbStub.kext/Contents/MacOS/VerbStub b/ComboJack_Installer/VerbStub.kext/Contents/MacOS/VerbStub new file mode 100644 index 0000000000000000000000000000000000000000..949dd4162c0979fec95c1a2d2a4d21db85a452a4 GIT binary patch literal 201664 zcmeEv3w#vS`Sv6supp2fZU!%~Tn&nlD+H9fAqi|Gz?wuzRZK#%kU%c$W`jYkE(J9) zViRjE|JG{M)<&u=wTMtF9Yis<)}mI8mujS5;;l^)F;Pjr=bbrcclPXTvhZ)e+V7kF z<>Z;?o%emuIq$j5naj@pq3^f*B}s~olB8k47)i1LKDOiED9A=C*e6ASM!kehX*81g zF(Y6`z>I(y0W$(-1k4DS5ilcQM!<}K838i_W(3R#m=Q1|U`D`wE z{6jm`RM!S-EXL0Xd-^!e){yuRZPW07QBhfmwNyU zRC9^wulQTqo(8S})YmskC#Oy7Ck~{dqTHMn%d)d__?WOmNS|FANOleFztE8U=zUR{ z=P~Llv+~(hR_vNR&^-O_w&m zxozI-KYaeRTPIiitmItCtVrg^jDQ&dGXmed2wduDd@o~l#;S}gY&8vC=8 zKFw{Mo7-4pL9!ynKeIHoAD?y4EKTq4Z(MD2+<4sUa5TkEKV6b?n{2sFX?fU!ouhHh zVMpWJxsC64QC%H3Ds>Zcn&vs0Vj%5rj>nwoXgo;b*FKKPX?)tzwC3>g#<`B|Xc`O@t^G3m4M5L=z=JG=z!h5Cg*mh~k*&JWVt^!*@ese_d?G zp{0pY*iO>6lO)I1r!1FeT#>OR)7$!$E|-@F$G7)RqXxs84P>dwq*N}X;{-)Hwy1SvN)FGrIFhMe}_>%dWm@?Z1e zhQ9uO+M?D#<~LZWEJGbl!}^^Gj%PB}!--n(H3yqdM$g~MjxC?WV{wqv*oUg!KAtLs zN@O2)G+l(O;L%YMY5saW_uIW=_+$pt&DgQh#&1 zg$t4pnhqG}G%m5At>d}sK<1a_ff*cId7)!!0NE*qD`=Wc)Exv%>BGoBen ztC-yFKRXPzU)^r}K#epqPCBk`H6Bz85&Ob8EsLgM=zO`2U!nx)Y}*v?*>R7(bl_vF zWBZ~w>SEg;C1;JVB`KHL(CQZ>Q2^A zo0d-B+S6ZWMZea9{R?!2#?0vlx~!~2^AVWuMDOexiOR(7={WGWaar3Rm->fEs9_f5 zUYPwJ`?Q>yu!w|ja^aRg#>A@njc;j#oCe*87eFUmSte^`iF-`Zl_lTVv^0UrJPT#+ zx(?ps_H-Y3f83VmC0m?25p|&)jR%sHt-bwm*#{ak69ntoeruYaxOFtT8ckz61?$;5 zYYfMr@CN3md}rKaMd|Cde$`*M5pmi-ggR~!Tp=&-g^dUI_9Lr|#>o0)r&YYp{=kRUfD5XZW9tnT$vd}cscmadly@Qy zWYgmIEKNGldDfQq(cR;QA6oO_9QeRs@Zm9jHWbvkpUu~Z+14X*2aZ^^fc+d+YT0Oh z&Ua=s9>)>*ak@B=)3h``?lF6LTa)u!0eOy2aS&i=EbG9D`~I>2;kU3e+8fj4C?m^giKyxlJy>jE?I^T8?fp?S8I50t zw%)gcm&LI?_DdZ19gQ(8$P}S9YIFJffLdrMR=^U9Ns6O!YXb$SaceUH9fI{oGOoX1 zaQ#3|fi1PXs*n9tOmqn?hd>_+=%Q3FVFJ_VPOFZQFl!oLg4PSFsWqggXs_P~V$pao zcYE4a_)`}I+QA7qTm?S{^`_B>@?lrU?hXct!_@zZCexN`nVwdRS-VBv41c z{byJL>FnR7Rt#+f6eidnQEZB>fpULyATTxXu0bV_Pu4pm1ebHk&(;(mKnx!Bg3$dKWuVMHm+6LxO zV=LT!_yTOPy$IXcN&Wm#_Od3uh%|mh+n8#84u{*Yf}t*u)3i->+~lN%Yodjs{z2C- zbbI3VIBB(-#dc9CxDj^I+IAG%Rj1q4gf-vxv?*-QCqvycWIA%C#n&!G zDC4oHkEfs}FXCcSpe8v@s*<{Tr3T1q?BR=0|N57XzBCIpzPjHAzg+W4yt#o&&=mVuShC#Jl{+2O`&&Cu4YhAMntrc&!+LqmhbzA9@7K?}G&8)U zQ;BmlW!jn&yJkYKQTaGl)pay2b2u8KFiVN^5`z82a4N<4`6$J{Zj?w1%=Xyp&xSmb zIqa z-`r7t=>CAGz*fNLek#UbJ=--Sq-U2SeyGX)fS{TzoTe|J+M?*$fx4KHkKMvW=!A5Dbu^9Iq{48= z1fL1+tcpHnif}zEbyA!cr<8j^;0Ye9=F1i zBdWvE7`sR{SahXkw`2&FX1oFjnykK{1(~X!rs=QJ^j%P-3<8b2J@&jQTsH|y)Ew$4 zMB%1@tF^)Qr&9yl`>-A8nCRj=AfSNbKp3;8zcWeUE@JnP^R0^2FZh`zaQX#zK+t3# z>E{KZzH(MNvNAGj%3P(ZT-9YYo}4TxAXZP8VI(NZlw@bG#qpZy1s;$*Y zxORTs+S<*vURPC+uRPbLidy)BaFxrmHs4#fcA>2*3(``Tt)kYp;?mq)TSc`kr`qeP zM41*Yr2AqOC6yJ|xJKwq*1No#(Q;Q+jc0RaOSYiuQ@rKr5EOe=nsT9i5ZVg^*JO56kJWp65}tSj;2UME+YI-_=~ z?eZCksr3u#-!G-YwO(Z8jlxoqnmXl)nzu^^mN&>mS>>ZuBvmPr<9?N*jZHQ%rD}dL(1XJ zkJz9-BcvrBmy2&ZJvD3jcD}d7LjhEkvOS&}kFA!8Y-OH`O)d|NHF;G@Wo1pN4c&`( zJlx(asV;RvBY$Is8=ZjlIrxLx@|?L@P6+)!98jk9ayuOpZ~rHJY=@p ze_x}SCH}9Cz))NOpie5pFL6`L{Fo8=rbeKP&e`yJg{@CC_J9BXi~r(viw}3j=@X@a zA9oD0?y}?Y0Qy|aP-BDt-*l4tgL^bJ%m|nfFe6|_;AA4OAD0yAlOC_3`QMDde=-6a zzG3~an2iq}lhNOh@_oYAYn}h$b?Bad@j6Z!WW9L?eNh6R=?pbC_JRSG)G#Ap zM!<}K8G)0Dz{3CV@#Ow&Nt}~<(0azi6i_#cgc-KJhk9_nD|1X}QQ_Vk&W zJdt4n!@YPu2z_#>G)2QUW>?S9&9Hcuw!bq$!w!bKn7kcG`E(>}``a0&Gu$O5mufR7U^UCm#Ft`Cl*a zCUAZJWI6}`_Nc2rF`Vg$ZKRqXV-XDsYJ?ErP_C6%~aC@K1G*0$2 z@yIrPZe{kIb9=ViZ?ETMpU4DznLX#+K0$Nux7TyBFJ$(AVD_9xYVTwAZ!&w%xxFu1 zD**8o_^0QTzl7&2>C?mPIp_BJ@{+xtlYIiSAHPg%KhC*5?-RtyUeC$?R%V~X>^bN5 z`uvRY-_7h-Fni9qJsTeW`0F|4f0Wr*GkeY>wNJ$NZs@a}*>leA`DGvCRDM0D{FgBM zoy?wdZhxEVJ^bN5Sgxrb;*`IhQ~nLC{F%(2b8fFMuTlB=bD71=o^x(L zTF76|DgRcMe*?4UoZIXB3+1opWd9(WleAJ+y%j!3zA-bISh#w%$I(>^Ud>=|}}g^x^h;PWJpcwojQo z=iI(rGxyu;IoYpe_jkslW6}DNb8bILu-9|4=g;$8#Oyie_Bee}Kg3typPrNbZ(067 zWcHkM`((jh&&i&jpX_J$oOAoZ`u}m3|9i}yb8c@F^4D|9e*#;OSTE7y$9bgo^O*ew z%${>@KUn$sb5VuNp7TiU`SVnD%${>@ub*$J{q&sbU&+dUJG1AU+YeU$P0aq+%${>@ zKU#>to>TtYnEe~fo^x)m?=Mt-JtzA;%sx6#Yd_Apy^bN5=L+_EPWJqHlK6bB{W$0L$%4I}lRbY9U@^1joZIX3qw?!H+26qy zw7Zx+=iFYOAKB|U+4JiuuP}Sgx%~*C{CZCIhgtq#Gkeaty-l#!bF%Md_A_x{q4}Tl zNbRlcy0MelbI$Gc<)!-TIpxpqvsW^E&Lg$w_vag!J?GqBKVMP)dQSN-VdeiRv*(=K z>&t6Yety6INoLPEx7W{CWUuFx|CKENkC{E^++N>b$X?IMzM0v}mul_DIk&e9?XTx# zf0)@{$m}`i_Jh^`b!K14>^bN5`uU2=ujiEi2zEm4W%is$YR~WUH8Xq8x&2*2{q>yk z=hrWP%j`Ml_Jh@*U+;XI*>fJLJ-8RzFKw=>SqfA%xZ*Yoc)&d*O| z_#%J&d}ATw{Q3pGw2Jog^U-a@Q68raj_`Sa?dR7E{>=F7G1~r*80Xg`#-f7cuafPb z!#F=*&taUO|CceICu{z0V4RVxMdXqTHYfshe=>^Y}KOf)cG0u;- zmoU!f&#Q^Up6;X2=SOTmKfXQ1IG?XN8Ry5(5ks{6_e>^Qk7r`TDet zaelt>G~@jIU(mfA%Ac>dFJPQsKU~c?zn)*qIKRIBJ;wR<@`o7b z*PowdoL|p>pK*SDGj_O^Kfhi)opFBsG=p(|J-Uc-etrCU#`*Q$pD@m^ztbCWsDAu< z@>`7a>%0Ao^ZPC5;Xp|K$f16nQEMt5R<5v?$pDDI!{o{L#JJ@(^W4vRQw*N`S+Y>ZS@4Qm`C+=s`=d_U; zccy4Oi8%TMf1mb+;HX}owioYZ5_qn_FBSOp0&f%eivm9(@H0jU`3u}F@E;5Okih>b z@UyUR)YosRz&!&0p1^-5@IwNBU*N;yg7Zrjc%i_5B=8P_$65t{0xuHytpeXC@b?8i z7X4TsAG^S-1pXs|w+sBZz^CK5r}v*HaG$_`DeyN1e)?F!pTKVw_#uHG7kJ9JV1MNT z-zo5?1pbM@hmH^SH%s6v1nv^}T>^hg;PIFz^zpnz;I|0;ae==l@VL{1{mmCR9Vhkq z-6ilh1wInz#d`f5fnO`|hXwwsz{g|W)cY$C_^kqeOW-ojll1mk0>4_|I|cq%fm`w1 zgx+7Kz&8o}L4m(1aO+vY{;~vKFYt#1-YM{Lc=MaSeDwPZdVZb2cM1GmfyYk@w$Bx~ zPvE-+-X-v}CI|a-3VfTu_X_+If!l1s{t5)%BJe{3|5D(|Q-b}u1inMye-wD1z^6|Q z_Lm{>%LIPC!0!|IA%TA+@X^zP^Gg;uy^$(Pcf7ww;CBoBNr8VL@R8Gl{Ur%}mB6nR zc&or475K9Pe?#Cs0v|UcxIFU&eyPAW3H(O_-zV@6fqxNH#q-nf!7NBPJurz@P2`(ofqu?a)Dnj@OuURjKD3kgZ<4Gc$L7vFYp%x zeq7*Zo*(Rgg}}E8yiMSL68L8VpExJj|3w0K3A{<*zZUqb0zV<}`E!HwTO;so0{?}; zUle$+z-@`a{+9~8THrqr`0oV%H-V2x3ih8Q@Iry#An*qS{wIMS6Zo0Q!TBu~c!j{5 z1^$@8-x7FiO0fUg0?!xtH3Gj^;OzqchrlPK2Isd(;AH}D68Iwme@)<0TCo3f1YRca z{}H$%@DBt&c3!amB?7M%_&oxDOW?!j2m4DCc(K556SyMqR|Nj0z*EzM^IIwK^#b1_ z@Vf-QTj0+L{C$B-3xe~XB=AK7UoCKtz`rl>2L%4C!2d4raSMaXbAiB%1%8Xb9}xIK zfp-dg>W(xvv1baXch+V%!kA zA%7Lv136(Koo=;4a`X;9lV8Km~Xln2vIM0qgk-02)Jp~)hMdrj zdJ(#zKL*$ZKZJ$QCv1lt_g+Wap-;FAazYE_7=~2^GlC0;WSw*akUaJLG2r?T{1hf}HR$xlgASdjBd>YUVIbkQ{gc9N~ z9as-JVHf0t7RYA+eUKA&Lr!Rgd?v5~a>5?S3F9F@2iOcbp@eu6+8|E=?tq-o0y$v< zkk1D0g`6+}azY2>=K~eU2@@eF zbV81M{-fI=CrpQ&un_XOz{8Le+94+_hCC720Xd-qa>8=RlYpI&6FMO$bVHsD?1G%I z5OTtL$WwsbkP{X|PUwR?71#qgVL9Z44Une+CG<~1H{^uPkk12JASbMcoNx!^^MO{# z34M?gwnCl`jE9`C0dm4N$QJ-@kP|jTPPhy5g}?;J33otF7?1IO0k9e4h)}|KC$vF+ zA#exegcisNyD{z-0m~sL?7+BF5yzK{!0kA`5IQlh64H4kp@QQQVFHdzgq_g010B#O zEQCJcVdxXKL!U4a`h;E3&j321Pgo3n!Vc&Y9)><)I`j#KKLQ*hCQJb@}o8<&ftAJ0T}@ zLQd$0JRjHvIbk8>g!PaY0J|Y4EQXxW2l=JI9>@vHAy+xtVHJ2M;!D_y>$Tqo#^X8< zVFS+BR1Uq%zzZ4Lp|5i2Uk>?UTz4Y0L!Z!!>!?=%8*u%Gum|U9gvHQb1MGl4p#%Da z^%xgd0=v=w35zi<2zNlg2xvul2z}5eOviQKV&E>w32pFCxC8PMpcVNN`XDE4MS0c& z+#kgksrwnI+X1$hOq7;?hHkP{Xn-wnheC$uA9LO064 z5!i*e5f-BSgbC2E1hzt-&U|Afu(PpH7pcYx_A zKVcjE5H>)5Jy3$2&<#0ZJ>)k4yWyX(7;?hBko$m%&?jt#oX~-Mw*VE$2@{boVL9UP zU0^5TKWK4Cfh-vaD}KA{u-2@|2; z1Z;yoVLbE+eei!Pum|l(SPuV$yCB~VOn@K49gq{YL4F&Mu9p)wLr&;~|L+0Y;h!)a z{s|ip&t{;6eoN>^JPF$%ZvomMCv1kCa2Mpa0}~)8+yOb^UdX=>OoW`U6>>ra@;iX( zkQ25+PS_6l4}f;a33owGco_0Kfey$C_d-tC0r?MsPRI!r$O$_k-vKOyoUk2o!g$p8 ze}K)XFQJ6`61oxp9|5}%AHqV!U*+)gWAI}5Av_E}gx!$e1uTc0umf_!9>{+JbVE+q z2|1xOLz34}2?+3O*PH2UkFcI>f0^1-bjE9^s9rB+6cR@~QgPhO~`2)bckP{|APUwLA z=RgH=!bHdkoshQy+aV`Rhn%nw@&|#3At$s$PFM{2PGAS*gbv6F%OU>-uoH4ZC**`~ z$R7fBK~7i*Ibl8I4+Fa)CoG1X&6Z#-0Y=!(0U_9i64UiMILH-+{4RXR}$O(5rz8jbTIpGe-3HL(&C@>Ln z!dA!$70CAh(;+8pgPgD(^2dO7$O(5rPIwsdy+8-#gnJ<;?0|e9&5hn&z3`9a`b$O#i5 zCv1TKr+^aVgl^1-gg(pPN*PXLL2m-1@3^H&;orz2lW2{R8StmMCcPbA^#(=9dg2S$O+x>^Bk}Xeh3TU zhp-s(KLI-+Cv-qgSPuE~z)r{sosbiDVV(PDU@Ok+4g-r(&li9lIF1rJP)|ZT;`JhM zFWQ4J0r4WV0bc?-u>UVW1^WpTAt!7Fe;H^6CzMc*SAg{>2VocLLui5gRiF=Y!fwb3 zJK?tjScv))w!;r$7v!%2iy#<4f$VzU62zNLQZJKd0r=Q2hQ^ddk{ZD8|3c*+aM>j;QWs;0rDfjU62#fkH!)v zLjE`4UdRdKAt&rc{oe)FLr&NM|Aak|zYp|5PS^=KVHe~d0Ns!i9)_Gyg8wdH1LTBV zkP})U{}9*=Ibk>CgjTfoN5BTOH(?LX%Lx-8{}|W`IiVH(fY65X_)ma4a6N#~0)4`C z$Ug<{f}GF>Ibl5He+M>0PAEZ6m>r=C;S`(w!;r$I`j#fasK!@(1PnOg!MRoBy>Rk zI8cE;VIuSicR>FOpcVRrKIjt`Lca%i82W^E=o2i35-WM2^*kK z=!5(#U=REdmP1b120vc|ZSX_b3_pYo&_4l`;D^u+eZn1(_W`Yt6Z#-0Y=xhGU_AT~ zHoy;IGxVhx!~yz*_0T7DBA!vecE}0S5l_N;=tl#)QBJ~Q=&J~M40s3Rgbv6FdmtYI zbi)r}C**_<_>ToDkP{}tKjB{J4c(;+8pgPgD(^3gy$@u8h>s1J z0Gt9$1kM1a1J402wc@xLC7pjg!#hvI@e_Q`NDc2|_$!7A!xtF-li}BKn*JZhX!tS1 znPWA6CBxq_ylI>!A2(jZ#?v+YfZ@t`jTer>aUA8TVmJ}`yZ{~zd=a=B<$VeG7Ro`m zXtahGVgFyiUqZd!0zM&Y_$u-ve(wYge~o;IUprC5iDzoKg5fm`{|-NIL+>c;37>-< z;hSe@_&&pKhOMxp{SPtR$Bp;Ulmo{tt$e5g+1(uzwr4mZ6*B1n806#&8b93Gn|Of2cX>-PD@$r?v%~7(hezr6HV4v4%dYpjJk=$Ync7d2 zW^V}NEp;7!d^CGgxV`j)pxMr(X!ol9?Q- zkMJeUN(@_xtnfj|3h%J2GTXVSDokanug+$>=JS{N`hTX?pw}8Hg>>6crL-^&9;&Hp zOn+qu)biKcKuc`%P?d0vZm7vdlfk|)&2Fd})=Qw_L+t`BZ?JEG5a`=J)H2Zc>Adj+ zKly9W`i5E|&2OZYRI2`raAsvqt$$WB)N|FlO6$BXDh}qSkcrf}$(fv%vy#t(7^>wp zWf`9JbyfJ0;##eb8~IJ936KA7akewni=QucZrWft0~*<H~frM!$&OKyldoVpfU%Bpn+vz3>xhm$gO@98rb@WVLJaU`J_ZP4xH#n+96)I z&;M)Qd?@Mm;V150UiAmp*-<30FUkK)^f_gQJMqKl_+9icJGGy0H`-b2sxITpk@9k{ zItX>S2JQBi542mXX);QjQCC(`lUGyY4JmR8_VS;5Hz*hFE~xRARIb3Ux7UVPr((DN z2jvaS(@Na#%FSwn6lCUS=Y}{)BM0nf+bIiCf%m-*9J9S`O{tFi`)ERM+1P z{W10*`2kT%o|2T5vl7EI%S8+Dqy=;|sxEV3*j2BqSfA%ADNE00>vz3kGNutx zF=<|;nkmVVXs-5DcwNX{8`weRTp%6+^o#4{q@uj+{Or6{*;%?Jw}0(BxT=47IJl~R zZXR4Ug?0R(69MD0rbe!s7P;!Y$W`YXsj7#Kzxg_Nl-8MB@FMMhc+v?4EeRn>Sl zFRAeqY<9b_EZg98CZ*@B)Wlh?+EP!2+gsx?@IZsZUE}d;%dvtQo}IQf46M`gQ;hOY zPWE?SeI)(;H>gTsl>I$85@mlMjzrntiz89?_v1*E{XIDnWq)6eMA_e)BT-H_>}6r% zyuesF#jpjF!ZcwR?J#W^MmtO+hS3hwiea?FG-DX;FzrZ-CVp~N;3;uqVCCRIQ_rt6 z1-A{Yp;pv*E7nz%mUt^_s`Fh{CGPSX4-G`;f?Cdu1|OLglz8wzqq;08Cs_I~HL)p7 z$kpRoUr~$8VEU|`7|Ger^a^)r5e@1Mr*6rPqrrL7Vvol~JC7PTGV}D+6AT8cU`nDc zvy9r!)un<1qq?Qg>Rwg$M^&&IEZd+fhC#JY4S%)JK#!fJ1?@@a=fBxFdCzlZ8uW;8 zr*J`j0>>}%qjm$&=Im;(XLC|g85X&vNLd2ON4&CU2*w1{Zz3n_1poPet|mz(oQrPKJdR47Ec0k6Mu#mY!@* zrMPAiq3ir4cGw)O^rdSf^td@()+r@kYI+>P%PT6&Xu%M98>Ezy%@R*dm9xZKj#e;g zKW8bwlpRu;6!ag~6csqj95kS*ysXX=4=!1qTwzl^SnX_b2~Dr|nJ_Ulwop4u#1^Gt zG}E*ZN3lDFz|RX(NBpk!?&#=OzpjF9%4@2RWi@yk%}d}KS9R0NvMxhX%n zNc+o17xoiu7>6M_O}C5)nv(nr39%62P5i5g$W8o9ipWj;>x#%t{ELgoP5dj2$W8p~ z#mG(ktH#Jp{A7M+ORcCCp+A%)PEnw^GO59BjyTa97$y;1f z>q<(lEm`Nnc}PiSNiEhoxF`i%{RJtOmtdzmKni;Toln>i-XzfXA~p$hy@*W$Jx?$( zJoQ1Ft*EP7>+&QeUR~iW*S53S0@uG&yngCm-6y5{k2?HzBJW)T>G0k(kPe?k2GZfP z#y~o}p$5|7Ei;e~Z;F9*c_4mzs1zD$15cr$Hc$$UwSiJ- zunm+#qOG0QYp3h}+URao`epw6lYt8}Nr@$88|rGki|cAPXKRo7=y!@&i}m};ORCE% zT`S$LYC8GZ!0vaBw@mIGyNpqk*N9Ee67FJO)!!=PC8yI@Is>xUQ;m)zXO{o_Go^fY()7nTcYq zcU|gckJsp}>)d6?HP1yCs&LwZUD`I8RJ$s3ad8V_;b$B=%aoF`GH1=zcu0(&=!$hu z!E+5-&RI2ASBK`EQbkW81TJ{6YwP+vs$8|TCF@=6a`*=Qsgd@ikY2gkb#>r2LfGdj za7{kwGEPXT!?_vEj!pt89$GV28T6Kvt1BuigL{LRduj>J12s2wESbZy$-8tQGc3U+x*SNeH85~?QVx}cRNu9$4fPr>A!Uj(Si z#y|Xt5r7Z%a+PkzN}7-R*eciV@!_U{ft5PB4m@b*)vBF)piVQ72GI&!6x7<=XgZva z33Y|bg*)kdwnsHXy8nFE0z4GBNvdCVV>0j`Drrtg3kk&h(vs>@SLJ}sJU@6us}~c4 zuV|?kxH4-hD{*hsAa3*N2Eh9DcmSxjVw0;HkX_{r>EZK(+EtsObj4q?2~!##vdb^3 z$Tm0t(V2soM@Sawl{KXsaeE}gv$n$PQEv=oha7;@)dLZqzQSL@({;%ROhWr{I!er^ z1&`C^si-Ln9b)OVn{hv>YBdfO`Q>%qGCFjIjQqfo%71%`ui$irG|=KpxPi6!8g5`M zzK9!Gi!Yi7*5b?NfwlO;d0;KRbk=L}o~CyDEDt)RN4?yggr_5&%T=j*+z#nL3+k%5 zt$&^hIVL10`q$?E_V6#x1H~{@wv=m!$^r7FjF!FFph1AGeAvLmANHuDOQmle;lis_o##6PVuA1GJ3tZV;tFAT;7n#Y4 zVT?=3h~LT+)|kokgoS<;pIK9fd$FNCysp|{Efb=au7F>&=21oJV3ACFY!5 zTI1fVoeN88+C2K1xar!=pc1jX^Za%Q`7{o&VL`dVJ?iZuZ4v4 zskBn{TQ%rxVl4Sr@^Gy}yhbP3ZNt1^yH3kVSf!hlm1R{SOcY--ZbD^tt{{MN+c2Wc_+N zQS@S*V7zMe5&WcZrAim>e?+dOHILwo2AGzeetr^^7F1N%dg=5M&w}HexUSUee}*?$ z6KCUU$&Jd5vqG)FM&s?q1=>ymn?%60*`hDiCI>#<7b#`f(={|I|+S*QLBx#$b1BzwmAv?|3#kK^^3vt zGP?H{wq7`HsTUln+4PS&IqBko)`a0&Ts`ESO8cpXC)0po4NfMSMotE7!mtMan_R;- zqL|xBwIV&bN5<6a>>-+L0_ zoL^Dvzky~DL+x5+=om<+)<4Ngr6UemF1Pw*X{3Qjuc&2xjFwG77(!APu%&2&jZvv-lN+Rfu2iUu1|L{X1A!^IHtE z@(8T?k`gOwbE?&wd@kN$b$jW-dGu)Y-b$F=t7|+Pb8GMx3|0o6b+UFhI;U2a8-zv+uR#9ER6#1;U}Z?AqXQ}OXoN4vyo&Jkr7o|X zMuyaqD#>n!sr&Hd%#i!S1*-x@r!HJpshv4gUri^VMOf>WZY(M--&nM+q@prdvc9gw zQzjLyy~gFi*D2TgFAK9pVr{h>PuF|bk=NWLbxLIq->)jEtaCZ_<5NB8@moQm-z*J$ zg_D09H#bRrs!DyRhc(S+-4|KlN?Teb4fusn?rq>Nmj<*#-jARw7{Br~NREEB(67mc zI9r;#a&bm38li4&QBDzmWyG9PH+@N!@60MH0Yf`^@Kx}Y`O9!$b}5>@&O^_;=ak_e zzAxm$H}b@N@K;M;B4TTFad&P_Nm)S&z84GMHI(5-crKz_bFQLNS}u89C6#my1Dhqt zMBSWAPbbvQEiI|oTvuA|s-BCl1a5@+TnD-lIzvru`S~j|&tK{GR=`jF`Duys5|=Mo zG8YHhwKW$*N4Lf6Ta>Rp7czHk9lkj*mrLhpG*3H`62)0KE!yNN(=2P}O595Q>hGLV z>6=nc?aPq0=U3xOTuJ5J`t*54^HTkl(MpT4rTfW^6?WpU&GUhMbifJw zx`@P6eM1GUECzaE10B8c@cnq2Lk!;MpdRMKz2IWt7fmD${0fUf-xNV58{kb8gS|*1 zDJXyKFro`~P~k#ezY+W*5k6M_3r2{)sM-h_=omb}3%PWMFn)_A)Ki$Nh6aj}z9P&& zghGAz$CAM=|FJmaxUPFF)8OSDhL0tr?0KNcFgYk(Hr+6?tt&N;}^aIQz`!fUr1z)U!fH7axTPQn3p$&=p}`Fm7l=^F)8Wa^I9xjhwzUM zgX{xpfzE577H$|BsfHOy2C9LfWVCajVh{K-r=S64;MsUc87KyVs)2K)R&!eF2O028_|Xh4MSHXaY5dWOScAhqDp5ULp%459l5 zY90S*GL zg!HIL->NBogT|m22fLEYj~M|o0%iov2$&HtBVb0rjDQ&dGXiD=%m|nfFe6|_z>I(y z0W$(-1k4DS5ilcQM!<}K838i_W(3R#m=Q1|U`D`I(y0W$(-1pb{7`16;a_KlRJsAx%2PD4hNx`s&7jV#lNz#T|M zMFrV~1x%<1yPja1@hEKaL>fg!rFd5+erlHpKBB*bSWW(BjE0bWkZSkD=PBhr8dk45YAuunM}tXuvH~PBp=(O0=+AzZf&h!B>F4A zT-#-%;NU}?mxZ{6`9qtipFlmcG72)7kif^b?F?ps2{$UprUv z1#G!Uk7&=Dsw(`J2>Xcs+I`xN2Ce{PO{+>+_5FLPo(&Lceu^?zuE^JVo5ED=3)AHD!1UPldN=9o~~2>hFN2XW=&BdVj;Y zoT28A-luEq&m#CEuJ<=0#9t}Bh1M?><7Z|5(kE#u#P$CChHQh{!GTm%l$*0+S$0;A z)(VhBF^ynUUed%Q<$FkyiXLiJcST9{cC9Z_Tnm>(Npn$vglnRt9pBdG8>gx#Nt@t+ zQX%;Bz!JSfro+LpIZ8_BM29p?DWBzky{me6{e^YAW}bdq^}_R>J{K~rJeo3vgLu6? zO6p{DkG9A7f6hw0<|wnK%vH+Xvy&wSMEnivOFcDpZu)&6-M);nGWvlSorG%#Uah0| z<$s}0mj9Ji3vE@}tGsO$wYC+P=H}Wes%`vzMhh1P-U~EBXM#82=->aXzR%c(7ZT&w zo?KqMT-bM(aw zsN#j?1L$RM!W-l8%Qn^Pxzf}bwNq`E&qz$IUr7Jf1i77qk6L=0)?Buntc584jKuVM zeeMA@R?CI98D*k^znunf!dqT6A#OCY;wSrTn0Z{btmPSK zHud+JTxF;ub`}-lHI@8rJ$MHfdo2`VgZhk+mf&an_%>dQx0Y|?6@eZKpsJMZ@zi*1 z>O12gvX!Yn76W5VjyI9vHT*VodEW8ZE3cuEzp=uNP7ufxYRhxxW;r2*KfD*)??%uv za)vj)zSCu#34)cQER2(E6}Tdjwl*0=+$h##85uXt6L zZkA@$+Gf=H$H;8tN3X6j9`L5rjDQ&dGXiD=%m|nfFe6|_z>I(y0W$(-1k4DS5ilcQ zM!<}K838i_W(3R#m=Q1|U`D`I(y0W$(-1k4DS5ilcQM!<}K838i_W(3R#{0Ad&!?c)}dy0Pd;PKT_4<1_?{osjf zV;($lP-;0A6SecR7-^^Uu2h5KJ#3MDV=SrCzOMdz@+@v?bF@v`cW;ce8{ZXfww!J6 z9Uo=yU5)K8uCezXj~TbKGiJihcVfox{M%6J4qvqN=sVH&-or>;kSFZ!J^IfW>rU&$ z1F!#c>4DcLN6R1EC8@xETl!xtM@F^`zdNJ1T>kVZ`A8Uk(W}Q%4&RCXNAX?uarj#C zi^b7W?>qhd%~M*(wR9q{8Ip8I@l0u-D*Hr}*+}-Jv_O?zF<#ZfcZ2UJKEz}{)npS$ zb}q9$Yl5mLlWdN(ulz~-g2^Xht|~#<5+q+o|L!H#vEz)AQ3bA_yv1>+*zCfMkvlw-sVGyIWr?m{P z&ggAB_C8`X4sjl<#);y6Gvciv-Ur}^d{LYYeFVjMoN7;HlD_VL6fquSR41!M?I#V` zeo^}ZG&^tHpoCjG%Fb?>pEturi>UoGzMKb>NAY~_CRy{HFIWJ)b+ zzq8nTTcf1ik>qK)ZE;Vx^Mj*S^pzV%NWEH{WS~u+^tZ*o+yB=!p<}53p!Ef+i`vdt z*?TP*BW+vH>X8t~*3%=bTl85i!@rx^n{fF%M`R;-&|s0$Ho?c+L#3nxOqYCI03S3TlAi>rbI+G+#Hu7s`RT zckIp`*rq!3a?l*M2{ttUK5K2xyC`GTMth7@fbp!AJN3+#%c$I#-~6(}XSQ4lnZIrY zXSH0S#Zt3*_pFxX;1t&_vA(=j*tXbxWBvB-vs5)Fi+0HSek|QyC}-?@jIv&##xJg zuKBt~n}gTF&Twv-jw7fkBRz!3Tu8l#_%|lZ+w*Pv{!~o za>FEP%z-@1xzuhLFKXE_hOe?APIqAc@2942?CR?;@OlDy(YQ*5f3HW{?8AHz)Sg%e zIA%*@rkyo1CFcD2ly_ocb}kForl@N%j(1U*uePAR?HHqzCDaA})$wKV<<&zz*&?An zQh`2Z(bluaa2>x~=u4g;a zANO1g`w_6eCwj8SCf{?J*so|_;IUEHxKB-LS&X@Hu>;4pvA(=sD>Hi}S05GW;I4G#*ls-yLgXTHe9D z{)FhyATG2Pr+jJt@Q*{x0l#2%73X2S|DQ$ZALm>l{>3_oWxp*#-?v2ITU|euV7;;k zYod3Cw>av$)O8r;sUF`glUp1S`0?xKPHwpn`WcAzlwy1D)RDP8_wGG`^BP?Yg>g;i z4Pu@B4{vQ@!EcN;@uUm5Mn`zxOIcoUE5<2dZeY>sY0*rZe zyK{2Om(kK4OF6gOTF^hneFz`YP-$NI#rEFl8FuX)S3U0?yAv_HLzO>m*PZ8%-3gzX z`~Z`y=fq=org8Z!=0`mT9=mfcm!EIncc8z&dy0AY%`-^9NDA7aivm#)dswV{fc_TGdji~+Tcg4dsXo>u!-;?$O@DDUC~9H%Dv@>Zh! zLC2fLV}g!1{8;0N4n9sT)!8M&pY^`;4DIyC$%PTxq#&$q--c)hD0gRmd=AqPSEh~{Huh+@WIrmCZT9za|I;7IxI}LrfR64JP`x=^))jKR>YRl3M$B#b4 z;uBeY3FUa3NU ziLi}Ad5z`|oL`QcjHJ#VtzqU5q25tqS;Ev?9D@?dFbuZ-v3Q?0f5eLZgm}>W5e*%2 zj32}NFXkco{yWwYL2YE<`(x;cz6bN$5rN;A!}#rwiFx7J$`P11PQ(3nhZ(}jm z6&GjpHbnpJsCrCzZd%I`_@LO*+Ct5n*4Datg7)$2`)ymV?7^C>TYvovV+q#+mSK*% z_(9aEh3-B46y>=N?Q$*BH3sdY_A{JEsb#=xdIpxZt}w>?$2jWw8Ge~xZDS+_k;x4lrey;!%sM7O;{x1FckUZvZRq}#q;+eX`&A2R}G1k4DS5ilcQM!<}K838i_W(3R#m=Q1|U`D`I(y0W$(-1WqvmQLyXB2R|=72R|=7 zhyNDu$+}CLlQ<{!WQ}zCR0bV2-0ZnblKS4Y`W$%JtnXdP=f;!k=EsbH838i_W(3R# zm=Q1|U`D`I(y0W$(-1k4DS z5ilcQM!<}K838i_W(3R#m=Q1|U`D`I(y0W$(-1k4Eh_ea2rpHroe)sEkDQxU&Ks^Soau?+DW&G=aD!x-XsQdExL zaaM5z!_yezH(2qp+D9=Q%`lFkl_7o~8Xv2D48ySu=|_=BKAs_dQ&{ENSN^T`c*Z9( zJcHqx49{YCHbeZDEk0KJWQOm4TjkPjyi)*jsl%tCR*pnFG5x1LSCX!pFZ-?oKDJ8s zorA#L_gh(+2^=<0R%QS%o+B&Mfj2Ldm1)2S8)fAo=zrZW`=)|>zm}CLz_eAeg5Q3U ziucP3e*Z~&FIiS50f*l%D`x}aAC;A}fJM+d6Ik^NSvdoEft~ti%Iv`cPI* z2Ohd!Rwe-d@@rWc58QCEtdy^iq^CcXedEB#M9Ion;2!wJk3CDXrpt;9?5L0xD{ywX zti%Cts+X0~!1T$oG77lt0$CXeyzwzvISqL9Z?ZB1_~XlDWjL_mD_OyBBuNYIkQMy4 zl=LF}4F!(9P*(7}Qqqv`$jT64`4zGf1GH|C75tWzbnZ2>g5R-{>V73F67c%5vO+I^ zxOAwj^Z`@%$jS-efeu;u8W__nD_;TcaLdYx+2s-%a%FDst`UqQW&0w4KER{jZGJV{o%fp5PeEB^qVxm{N9n^n@! zzm%0vfxrH-tb76-Rw^s_ohoVlFVg^58o;)oxu2NS$P}i-Hd*LcH5aL``!ZoaEz?{ z60si_SS;6mMNxRTL z{sLSJJ^W6&^znCP%C0S_)-gup?JOiA0i>w?1E=ZG=r-4oAUrzyxQSXDmODD?8 zlfXu__W|IlCuKzeZoOYteh-||Ei3zhBhX$?03Y8iE58GN{XJQE9Jmkt__x5an`LDm z@Xj@|vKRQ8PgWiS-ZfHI_5epf{wVOdKg!B(;CD)7Jy|U5K9^fxgzq^5N zp}+hDcqjVNUBHTivhrhKX^yP?2v|8nR{jTg?0s3;0ldv4D?bFT#5lYY_?BB%egHf; zPFC&!dREEG_kr)AKi&@f4)SXO_F;Z$27ZL{eGiy-SXOQW-cctj+kwT;%F3-k>2XjT!D6P0RDQftlSLz?c1_)6YyT-cO!5-+I1W7>>FieE3oH2S@|w7 z=XqJ#0(@DP6(8_))Z+$V=AE)~J@A*Mvhp3^omN@74*1!vvT`l(0rc~0fUQNcvKhE% zv8>bsUmY(iR|C&R95w;JxI|X!fG?jWD_-Cy7%#QJn44t915Et0tXu^gh5EUH-^P5k z7vt}T4%sKI#JqK(>}$RR{d$+|tHJ(RXxD1sJt$Wd@T=!!r4slt`oTtE%7?PD0eBGY zRRMhZO3cH+iFvZJ9{33Q&pKcx#)k`NyI5ArfJa}Gl~UjtJ7i@o@CL-E1lWuIQ4G8p zUIW}YPgbq~{sZ;79QYyTtIL4#wX*VU;A7vHl|tZcDDP_E1L*&& zfORdhaw%{l;#dGId_z|9fk`M&93`5qmIKd! zSypm^V~@znGT`?TW#wYv_E%*k2YB{ES#bcH@0XROz|*G7$`WAXnX-}%yb$wk7BFw7 ztYiYm-5@KAf!`h`D;dD2P;NUg4&(YF;FEXB%C~?IMa#+}U{SrSTnOBVcDMler|-(j zLf~!CUjTd_^IAIanV-taeBfJMvN8{tiSncYm1VM$3VfhPR#JdBJR~d0K$?e>fMDlq5dHI_R;vF=Y zur3E~#rc&J`1qS>PvFEaur3Go{1)qSV8tz1mjmy-9qV%77cXI54oqH$bvbdYw;aHU z@Vgr)0Pj5^`<8-#eg)2hF<$n@%f2Px&9k}xetkZ#4!u|r_H27Tz{Ns7y*R^d}-_bhl&2RX+ zwiWBbf91M1VGAu*t(?tW9I(y0W$(-1k4DS5ilcQM!<}K z838i_W(3R#m=Q1|U`D`()CC`Me0FHjg|VYK)Md;R-_*x?MHeS z=_t~;p;BK0QYF%Eq%V=uhrtJuf+Sg_zCxr&kSxQYht!TVdIaQ1Pa#=Olllsf?nXL- zR6J7Z`wP;TQBvPxBoERaq_2@GMF;ZVO(r%<4 zq{U;UzT1#SjFbAVM7j^@OC;xbw(kUm06kC*y3A?-%$LON?A zY>>vCA@yB@bO>q0nNpt{>2;)WXQ6yZcOiX*lzO(*SB`Wy(z{4ACrN!9knTfz1!?4D zlmqD|q`x3dwZRwCex#98q`u3L+K`STWlfd(Zb#}wnllaUg7gQZ_~}yLI;7o5(KFx= z>29P?kQUBFjF4VIntl%AiG*)V_Ki+JJ&|@I^&l;og*qc0K}tLqZHV+7(i!K$H_{_W zeMlG2miq2QI)XIke8d3h5Ym`Ar~{HT7y3xMkb02piI5|`h_oaLx=4;>v?+# zwp6LF8R<(TZyMr=3O6j89<~}i>1B?kcMW$H_~sBCS^%|-$i-_DIr_x zt4DecY0eUN>LO|Nt7juc)R$O zRhcBPlpun@ihx8$q75!~AAv{ipZ5nK6gj4knUr;un6=r4ap{Duf5NzQtEOy1x2i%r zw2ti1HRCENkE|%P5AE={I*y#EDvm45z4y)B_vYQ1xBC`4Y12Iz?E7}^H@|o0&D=L{ z2He_Vh!5P~f_vhTwzt0y?)}@K&cOW)+|&rv7r4ZBXiMPQM?n|BeHYyQW1th@u1!N7 zfx8Iq!AGGjg1dGHb$3!L>aOaf7>QC+Ir3i{RGog1mzJ zLvU@s1a$}Q)8JkPxAqB$8{8j&`x&?`PXZs@cfsAV8*~lam%%On5a>U+SHNxgFz6z< zcTGY)f%^k+3*a8u1Ns8)Ti|ZVK;HuHX>iYjdmY@?DQFMi{ubQBS

zZ-9Fw2W1KF zHE{RaP|x5lfP42|$Q!tm;4XoC|1|Vn;9dsTI|F46uG@idz`YIbseSMb?veeV+u*wM zkY;daz`d&g`2_a@xV1${C%Biv^_DxC)1Vs*_qwHa}pnitvdJbC89 zV{B@lovr2asq}2YO_=vvaV{l(8GuT+D{dugdG-B5^63kBc?>4s8gPo$TBew_L2;_J zNL(ue8HjWFv|DGzIn2r=#FO1WnVs1` zxi{nFgTGAIGnHK1&RR4Mh?)JD(TvJXSV@fZn4eO2}MM7wPsx7%G_rl9}rM z1_2~2H?QNhOwAs0azb*VlqwX`klGC!b5Dtv={4T`edTi_qwtQjwLKmCWRFDn%<-t8dz_ZJwU4*wreu zgd%*U3TdsK_CXT4lqS^ewk9Z(2`9Th51Pv*63L4Fk-A+K1rn$hQ)W2b8mQRQPPGPw zgt;E7K!PhNDA2Uk4JEPN{nagIjoG!Y-VdogL@3Wn zjExUDt{!A6^G$+DB%$jnmge$yZrUC#)ttRfHiIez9k=M^{c^DSGUal9exfv7gu;jV zgAO&l4LbJm`NC8wpWZr~_ImmBY-+rR7qHbW0}!{kY6>Y(Zy;-Fvb|C^T`A2vIlIzC znskEF7EGCwo*hq4?t{qStB`_!@W(5wy8vpRnYJl)`{>@K6hSf|liH`|n5$c#lm#iw zB#$mZt)NnxvQt`NcV{#8s_kZ{QZLsGx|MUPnW=muksiC)M4}hky%)#CeA!MpX-$g< z>cv3un$y!~kWq?f>nv1q8tdChjVH9i?}4sG4EeT04_BE_rTfOlH&-e+NMyH0NOC}u zmu#ZDkSVJYJ7MTD3}eUxseQbd6WuH{MV3XJ=whOSrFzlODf5z@pVjY5$V|^qV7I{&&I64=(fg9FOm1Jj zTH8{u&g)$oHXZa4gCyRrtscVTXqEtZWOtc2wRWIgC+5Ipe+gzD)YM|P-5wILWA$ghK1V=Dh(;}161y8J=A^6NtvFpeyAOD%_O=eccjKsJ04FBc@v!O zKCRG=V!hGCdZLMSM-xj%6QilQUrfdAt@;6E8#cz_*OW!1=7rsf#Q1*#>IR}HA9d@}?0h_D^w;gefHnF0e9|5Ze z3tuouU8g9P9(CW^1K*P;p}G+k}&Pg!2G#A8yJDDY96Nl1vJ5p&(v!9!2ZnFuCux|)=L^cOuAr67qR9=dIq6Id<`rnvSEXETIx9!L0WT2%PPdUd z2y+au>caF9r450&8Po$nGo6UK0ZmPjh}MG1wLkbbrrM3LDbt&8Mo+Tks+SVG8i`-n zdR{G@+co8>p}Cnw8|7%G0ORTw@~My(lSNBT`9!=Jf;+uSlUd7pHLpAq}$`bXaAw>v7x`_X6|%aWuiFj2Qa>k%|; zSJI~KK8;eEU!zEqVlF=c4=G%Gcq?3KArLLP;vO7&3N(ynp$SM3v2Sf5p;ixBhp`@^ zJOk$8FeTIzZeb_urogj4wLnIDpe(Oe(@)lIK@ZxiTS$TE<58cQre9SXSEs~tCdG2) z^(&$?QSQ70@TeIcc!6~zVCjM<%3uHx9w8l2qC4k3Ucdo^!WRQ)L!G!c0kSTEQV0uG z1i@y#p}4&$AtS+k9ubmy_qL+Qn{MG^C}T*SG&iDQ5LMetoS}MK2}3+T3B>0%^Qd8j zmS$LbBbH6DEOl+`mQN#v!eNPslthvA%FazoREA%(Is->Jfr^z+u$oKCacOfw(d#vr zqZ@y7N&n6tQVuLvUa>8PDD(`15Mzyy7<-j+3^xR8SxfXPQ^&vn+cV9y!lC(53mngA z(+Y>?t*vlq7TXGk=CrMFXolMghvvJjaA@}13Ww&xt#D{&+zMwAdf=IjT8PK9A+^F; zgdTX-rB>ougdTWyr&i)wgdTVnsaE1ygdTXdDm|W_uzrUOS1nM&dxOwe!j&MD65bbt zQo>arloH+(gi^v4Ae0i`4}?;}t3Q+y+6!2Hm3oox`kUp$^sSD6cT}FL<1!QP5j$DY z0;4W5i0*a`V(x6R)j0q>!7a}(a{j=_$lmCymC>as5Mhi6WVG?{k_Qq#M)t-Miiwkk z7oLT@p%7_lLm|@3hC-x?4TVVe8VZrN`9l3(A49pL&ZUtI^(KvEsQYLnL;Xb~8R{S! z$>?RR=SweYT}CfyT}CfxT}CTsVWJhYNQ(=^{Lk1O-xq)w>vm5YQ4n;8ar|sb})A7}#5K;YZ|KJK(vBZsYJ01dG^2Vr4X* z2RvbL6TpAB&|n11KOu4IdN4m`FGP{|z#996rF1Laa(_>o)z$rGQBRATi+bAIT-4Lr z=AxdqHW&4@w7ICKoy|o_D>Z#ED`%ki4caFaw3(RHK{a_+n4$)SKwG?umd}}kFD^9E z)IiES-J(XJ#>F%?Kn&B`fRGou)ZD;p5$?jtiA)9Zv$>d?sAS5p;z}&COsD-WLRheZ zE1BI@f+={drvj_10!)*15^Y$UtMkRI7aJ7dOeq&VJ~Rj~mYl>@pOjcP87y{FniD+= zDT+M2yoAquMW+Z)GTc{yXf3$c2c>CoXRti2fvhVp7S2Mkxa)ZLrEv*)|L~ajdC0D2 zD^3~KeY(2KLP)~%V|;gjB9=?mf>Lgkt82u^ZCGeKQ>wuFIH>a~AwvWSuoQ|l`zk-} zKIZOs%GpWGymeYJt5g%xPZw0kmJ4I!vqre+!qbi6R@(L3YBbwL8VT5 z{c+%3EU)j3B<*#dk)*vIG?KK}iAIw4`q4Zq)yIkL)CrOc!$#HiB_}J3+*xI)C z&h|60gH`u8y}~fd8uiU5Z@+zsvCdMnG@G4uRhS{9g^|aQk6E&%pni z+dE^gEse)sUz&ug1-N=^=^$JkS{9ETUN!(%N8sw{vU}j_I9#1rwjQp|UmK5IxOOAT z0psw}yWr{=TpeF}J6xTFt5ZwY!PObKdT#0a;OZh=y|Q#ITwS_39=m)q#J1$zdk(gr zxh1~jMfdv#@H@W>!d-<|Z^6~UTbIJsKlkqb zrLn7SeCgUVv744JUo&*>>eu33GZQ11V&~e=#*f9Gje&Rj#dqBVU$Ijw@c&W#zvS{Y zSK2RjAije5nu|~hC$C$Gy%=AJz0&ajhI-Axl_!^-z54aej*cs_rEB1q&NFv(zY^QM z3oe%&y|ZIEe7Em;y&b+{mv4vv@h`l$BwtKon9E6Wz{Ky>jM z{C_Ud-Vp;8>^PBFSh9S1yyFY*cY9|i{1{v4ffDMu8m?aKjmOUS!d3j#d&_%vA76Pn z7LPwmmrzIX^LLha?>cwgG5GxgUE=T0Y=qy>E=kAZN90v|{OW!Pa#K7u1XaJ}4OyiN z?l(|kZ?%KcECIjH^H7*qRzQ_^#5*r|*C5leaCiPF)Hd`TL=+ON3^e(F3fN;ckkLR=gJ1zvI) zVto#j`-=O0xE+#ra0BSs21rEbIZ=!8&KJeSNl?fo&)gwY^oaX?3>ckI>@5-hhp&c?24oKb>yxx{J*jS!+3oK26Eyi4CT!F zqZrD<9j?^H+hzb9z7zjnx@|Z7zp}0d|Igl!?2~sR``NpZed%swU-^K`KGt&?<2ZW* z`X9Rs|G#+uHJwYAVmT>{(r&n=K-tn zBlSKgueMF#;4`wVt!*9txCxQiGiV)r<9Vj|!LLz}S26NQ9}Y-9VU$Ncp6`wy;;R_> z2e%0SFGxON;&%vdkFR3nACmkFl24fUdl+BE$iFQ4KahOFQTaoIB7!$0pD^){FA@HT zMkIiRZq$FCf$(x7X!rj&0Gs;HGcx|-s3?EJ6u(q2FaIjW^wa(GGm=l3 z_-cQL=~prGJ3w#nb4KzB6Te@0d-1Cn`433`_a&cjRDMnJuN@QlCro@by{7aZko-F& zpKw(E(~`eQ@(C0FUY36qWByM{{*#hVnE1`oe@gNXNIqfWFJCo#mLV|{@+MGVd6K-|BU3r)?x1bi!kxk_KxXSF~)yR z^6!v*!cqBaKyUH0N%9F3Uo9_;U&R>zjO6Dj{Sp%&es({Ik*{LpW4pu8CncXS@zwZD z@wY*_<=+J7)Z=Gd@(B~aS^8H>K5X&l#!omZf0g9_ zhU60_{=Fi3Uj3;U^Z&5qe_8Sg6TeydMxG?Cro@*-;u9k)FH_yOnh~`h~=+h%s<&*Gm=l3_(QDx z2$w*9jr7B>&oKN|hF@hE6+z{%WB37v_b~hkhJTOYZ!`SY3@?LnR^#tt_%Viy3}gA^ z@SprZQMO$V_T`HQ#SeEPz6SPX|C+#PCb=GkV4Q-V8aTu>fBCe;H2-;CVj9o?NMf3w z+yHUA;mP^O{SuS?Vv_I(5aDwOF{Eet*988O^e214cO<6y-;X6Gd&CMzE5=9jJJcP- zG+!TO64QM3j}Sxot^c@4A8a%4ruW333mgMGEXGIe`yPqu ze*37z)PK$)hWs9r{Le~%y1$*1nEET&#@-E|?w{8}!^iljKe|(5y1#6ZnC@2}mYD8; zPf1MolVcK7|9ToRZssrZ`!Zrk@1<{v{I-D~#!us+^%B$k>Y&6lUOOu>jbHAI3qFm9 zc1cX*vriy~_|D4sz9ju={`GB%X*~Ugl)otDS6(H;r}@vI#58{0BQedVeqCZ3pPrPM z<{RITnC34(keKE}zmS;b7pt!p@zZ$w0}_+{aHqs%&#y{M_VrImO!o3q5|jP;n-Y^f z|3?y&eX|qF4(o^P#p@&{`{`zh$sRo^G1`4~hE!FA|eI`BjO@zWWP_ z>3PdN*UIwPB=|cerspA!#PodSmn9~9*XM~Z?K$6;n8q`2N=)O6+piPx(R^*2#58}J zLkwwL^EHv4Pf2`Iw#SnaU-_2s|GLCyzA5mJB;NF@z}LaR3Bx<`lE4;XXftgG1%3c9 zbXji;)Yg__c!c4{82%N8Pcr;nhJViREz4N^43`=Hmkhta@J|_D^{!y}4>4R}_)`pj zk>M8@{t?4hT_21u!SF7IKg;k%hC7$D@ED$C_!)-3%J7dEUU5S({7noO82&87FEacl z!|QGghQEX1gAD&$hF@X$Ju6sv3_rv03k<)>aPp>Lcry%tnc;H`zs7L<=3sbtGd#+$ z&G2!CUuAgZyMy6B%J3%{{?82mkm2j!6AZ79;XMo=XZRI{m#z$kH_Y%aGyD~X|2xAs zzc(1(1jElT{3^pYz(GE0|2D+%9K&B`_%9h={*Qv;4Kh5-@b5GH3d74+1;ZO+_yEJF z7{0{tO}7Tadzj&;8Ge>wI4&npUMp7z@d(2Q89vSM6^2*c77P!L;R(cdh~YB~zsB&I zH9`Ia!~cxo7a0B-!-?C2;n@ryWB5-Qew$%yZ7{qX!@tGww-|n%;brd&hIc2!k1$+h z_|pvkA;T{-{5HdD*9GI>%J4phf0N<=!0<(ef6nmQJA&~&#BiSBk2Czw8U8(n&oO+7 z;r2U&@!!ty7KZmS{HqLqf#E-4_y-KHx+@s}gA9L|;e!l+h2b|CzIS~v{4s_r3?F6q zEW_VtxbyB{_;)g#VHl3X3iJnm#_-=UeDnK*@_h_H$?!)R{#}N@$?#7YzTuu=d>>?Z zis664@SidqyEho#T@1s~UxD%{F#H*YUt)NH;eido@Fp4l9K&B{_^%nh<-TBeV+_|A z{%wZ;nBgBXeBH)i_!h%E8U854pJ(`+4F3(oH+Kc&8)LZ6@NtI!gyA1Ee1jDXzn|er zhJTIWuQ2=)!~dJ%wTWPS!wi=h{w;=|XZVKBehM#8m^9+BB;h!?RvNsst2N`~v;eXHYMTURD@I8IO z@ITD(uQU8d48O_n?ft>Q^(eB(ec{1Jwy8U7fMzhR-v6nc=q? zUU`2oJ-rM+#&C(@Pcr;(7=E7N?=u|#KrsG$86Ic&0K@;9;pZ9t9>WU^uX`XE|4xQK z#qb|9yyPDT`ALT782(*`zsK;q9}I>!#_&OgzrpaE41eH*!SHen|0{;S$MD)sLH>sr zKF07RhF5J4@_&ip&oX?G;p?^p`42K&XZR$;f5q^M!C-g~G5j%xzsT?l3}0dRx}jkB z_cA=h@P`eLLc-huq`0E)SVt5zBGYpp* zo@4l*GJKrj&og|Q;r|+gcTm7x0QYC$z6QjcZG7U1-I&9mi9?_}G^w5j`us?SJ4sl7z zm-{uzz+0`lZ|IAtmM$w^X7%4t4apPQ4Nw3au%pws30icIM&iJ)UdxaN*cgUz7 zmvY9b?&%$NYW0z_!ZA&7oLw@Xsr`Emh>sNk1Rla}FqoMYVQd;$!q^zvF0f;zH zN|u08&OTsg>opsb1N$IpEdY+^OTbo6)C-E8OEy=g>jl`2x+)s1Dcq19HrT;u;rwn} z?gk@bgzZEcBqN=GV?KjPqQJuX4sDhUFIJi+HApgJ8nBj zgCdDryyAy9Z?XTmyoo4&aOx@SEnmvnS(vDK8rsW6s@!tVwuvg*uJVUzB zd!kg!z~Rt2IKVj{${hQNi-s2-Ldt2=(2czo0lu0hBUM?h+S zp_H3+ihJSc_2IE0JCCQy4v&qLrtxb$Z`);8Q!EP(jvgEq&DR>hyAd203(c;$*O}g7 zXL9{1u{};eFag~N7liGdBTB-tb`d0ZR-Bp*v5STsh<inP_+JKs_c8^_|ev zo)$+D_VhT4u&2pUggsr3BJ62%6ycWkYYW*4E@UgckSYw34ynTs>5xhckq)WF5b2O= z43Q40M;tWK%%$nZm+xr1MTp4T@iGuo)6F>}Z5C(T^fD4t-t&T5*y?tf|JOJ4eCL~x z1}uhw+(+I?&$TMbSy~_j<9>O;dr;UEE)b4?|5A=#6I}W6U zReHoQ;ZhC(H0?y+fJp}ffB^~P78~Jv`>94JMmso%9o3Wd%@NUJ%BE>oQe!bFnaM^! zU?}R5Mf0*vYf-P^lPC!y_}o zPRx2|ha$eigAEsX1k^h|j6j4TM5lOzi|7<@ zgb|(MjTfU+yisFxiZ^zQPVq*N8YT2du?EKhg>%B|Kb#Y;0O6c)4G8Cit3Ws>TnEBA z;YtwB3D<&fPPiI`a~7co-a+zu&k-7rcSe0HoJHtCVi9_fScD!V7NG};Md(3d5qgkV zgdQyB7{6rr?I2VS!jC0vY9Ti48(Ox4%R(SZVLtvdB9GDLzgUFhHAA@I8=>|WT@U6$xuZ#lA)SuBtuovNQTP3 zkqq@%jb!Lf<;x6srzChqPpzq;kY3V;ko2N92diI8|AU9_nY^u zRe9XjmC5a^S8H49)%lb-NkH}FmT%Q>29{vu?XfZ*1r7%Hw6J}s68lPUAo}(i9xWr{I_rEdlUAIzI@>oVFh;rwW>Py_|zsci3o2hXorDu((D_(aw)J z)fyBF9c8G*o6O{L>Czl5cyo_2G!#w}4nq+!50&PMdfdqZp6unDUbN#DtYpEiRx{J~ zpg65&pKtC+&uUpo7VSBI^^1QB3tJ-sN7e*PQoKY$gK5UYGmWu4L^T#n1v2O4^FeLk zv3FHb3EH_vh_YLCYqc0WZoVcm}){S~gR!+V~8-QmL0~dgJI06mS)m#pvbQ z?Q4*^9^pjFLOD}Wj1*SjfDFYl#uM0_DvTG3-T?)lnbs?dQQ986n3>8qDv=&2s$ywt zrBr|;*Xos`US?=Y7SD0Txkq}7?J2@z+hOQfCY*v@s@GEU@@}eTqb%AEHq4U4&L+~@b`PjrASLO(vGL873O<9Ld}36M4KzUXL9!{C`l?=BI4~#MG^R^WQ*WkR z&d*PjptG5UHHMYO>erids!fU;?d+a@x~EDxa@DDldN^lH9PQ*vLSHA1t-@vsN3qV1 zC!zBmpMNNIYp5sj7_ zb%%Y>p^n-%tO}ss9XgCO%lo=ix{%L%H=qwQioChQ&-(XVxylSE`WKG#rk9Q|eXpP)hQ*&VmgZ77UJ0 zIw`{q2xmb&4lRm)SPHWr4lLVTnR05C45l@u-GKYu8xh%9!w;laR5AiZ*W-RjF?9=- zv|VvZIlYPXixo{f;Z`v|Q?KRl)~U68e@F$3OvKS;G!|46X^^79U}Gs74K|jd;b3Da z8V@#>q5)xJDH?z`mZBkeV<{ShHo%dG3MhC5$A)POR*j~&yT7_)08JSO z>P6yueV%rINpyMRe6MajTcn>1qnKX1Mlrp5jbeKJ8pZSqHj3#rY!uV0*eIsgu~AH~ zWTTi~%O)|;64~KxQ zqO}EBBgZFPrm9ayYYWL}wUCU~7Lw6wAsMYLB%{?rGFn^c)^9haa_f#(3*FIbp*vbF zbVsX&?r62p9jz9+O|_7P5p_DBsqHOQ3R~+%cc`Qe*QVT&t8u`Z=n5fck(8Jee{8&( zz@tpn8G(9WwAxsAYY0}^o6in8IWcyH!>pTHk^G-0SK zh5TX*UnQi=@W-fOt8El!Db&aocG_l7HebR+-F34Xy{hP)9O}o@o8GRhVha53z6Z&b zyf;&;W#D{yh=tXHT;O2v>62CyFqc3Ic!)+LyPuH$yJ5TAhx&d#Jt_}D@7FYS9 zdJC(9ud#)!%2(GLM>|zKS<6gMd|< z9_H8eY|T4;IT&lBQ^?r?<3Xb5Y068pL(+K*uq-)e9?cX$XTe@A*MiYHs%_e1JPY61 z@y(wB0k~@v#XBZ}pXE|H;L&VVcCfAi!d2iF^jguva4ilk#3?Kkfw0|dMvYV0 zLIQkad6=GwhQR%-ufnh_y0^T=)SpXir2<0~sai4^= zoC0jkZtSi$LxYZ-c=3+g1eg__d=ApT*wlkfy*$6jG@u37jei(!Uzu77Y$4GzfaG)r zhKtY$!3bUi%WgL9v=9Iq8b!hv5q+XN=eT3?Ol2Mid9q2Oxsz@Qyqm}PL=PW1lOl;V z7-F=PwLW<6h&O>2inGtDdJp3aWhm^PfpohX*N?T|Vy60`9ER*N<|+_iqejy2RHcq# z3)5*{`q-+40jHY!NIjE>sRyn=5#6!ZQHPCRd;xt_!h_HyTuD0U}%%VD!%R;!SXpxi1*G?W&cPCj=Gm=P}m9aWP7+O z9*%qEu85#wiy5ES_VjQDuz|`{G!mK!}87Ck7WxAfJ7M6{zS}a$bVr?&mI%2t9Y6WInmD>E{nS9+& ztG5%k!P8@m9)U`zPfZScoBrIFE#u3(lGY0 z48w*iHD|A5S9Cwv3j<$q7xMw#d!&@fO=RGGVF8~hM!BM`Lng=FH6|OU>M)wvNWb1Epq%;fpNF7z&e}P_tZr;0mitQdec85u zDCrby)v6ncV2R7*H)bk@-fr8=j7TlCE#+9Z(Y4r}JDP1|fp@PR;oD@m zxB0M*KN@eq0dJEjJAY_fdoN##cjl|h=8ZQElF^L6>2O0AG8oJ zsiK86x(7Gds7$$q(IXZ;q!6p2K``ppXXY!HXUi>0ZhbPs64rM)Rc}h+i0x zV>twEBo){pMHlpznCe~)YQ&3LXN6nV4YGT2sj0|>?n{Pme<<1F9(|FAbJ_?jWK%0m z&I;S&&@e!>tiPY_!W4z@T8ANeU(8otgIHKIGKq#XB!j5mluVwDlHG6w9B5F6kj+iX zAm|s4r`g*Y5AuV}$`GXAuneAl(=vHdyEdi33fY^4Em?C1Bqn|fo3MeEKhi#UA&te5 zGwbhfXSzlcAHTF4N%_q}mkMhY2FZ{{p-cL0!r + + + + KeepAlive + + Label + com.XPS.ComboJack + ProgramArguments + + /usr/local/sbin/ComboJack + + RunAtLoad + + ServiceIPC + + + diff --git a/ComboJack_Installer/hda-verb b/ComboJack_Installer/hda-verb new file mode 100644 index 0000000000000000000000000000000000000000..fcadb500ab6184c9cd5ecf0a32f54769a0d389a5 GIT binary patch literal 14920 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 cW&pVqrI#Q|J5uOw{3@(G6u(V`{x1gl-v/dev/null +sudo rm -rf /Library/Extensions/CodecCommander.kext +sudo rm -f /usr/local/bin/ALCPlugFix +sudo rm -f /Library/LaunchAgents/good.win.ALCPlugFix +sudo rm -f /Library/LaunchDaemons/good.win.ALCPlugFix +sudo rm -f /usr/local/sbin/hda-verb +sudo rm -f /usr/local/share/ComboJack/Headphone.icns +sudo rm -f /usr/local/share/ComboJack/l10n.json + +# install +sudo mkdir -p /usr/local/sbin +sudo cp ComboJack /usr/local/sbin +sudo chmod 755 /usr/local/sbin/ComboJack +sudo chown root:wheel /usr/local/sbin/ComboJack +sudo cp hda-verb /usr/local/sbin +#sudo chmod 755 /usr/local/sbin/hda-verb +#sudo chown root:wheel /usr/local/sbin/hda-verb +sudo mkdir -p /usr/local/share/ComboJack/ +sudo cp Headphone.icns /usr/local/share/ComboJack/ +sudo chmod 644 /usr/local/share/ComboJack/Headphone.icns +sudo cp l10n.json /usr/local/share/ComboJack/ +sudo chmod 644 /usr/local/share/ComboJack/l10n.json +sudo cp com.XPS.ComboJack.plist /Library/LaunchDaemons/ +sudo chmod 644 /Library/LaunchDaemons/com.XPS.ComboJack.plist +sudo chown root:wheel /Library/LaunchDaemons/com.XPS.ComboJack.plist +sudo launchctl load /Library/LaunchDaemons/com.XPS.ComboJack.plist +echo +echo "Install successfully!" +echo "Please reboot! Also, it may be a good idea to turn off \"Use" +echo "ambient noise reduction\" when using an input method other than" +echo "the internal mic (meaning line-in, headset mic). As always: YMMV." +echo +echo "You can check to see if the watcher is working in the IORegistry:" +echo "there should be a device named \"VerbStubUserClient\" attached to" +echo "\"com_XPS_SetVerb\" somewhere within the \"HDEF\" entry's hierarchy." +echo +echo "Enjoy!" +echo +exit 0 \ No newline at end of file diff --git a/ComboJack_Installer/l10n.json b/ComboJack_Installer/l10n.json new file mode 100644 index 0000000..a5f6eaf --- /dev/null +++ b/ComboJack_Installer/l10n.json @@ -0,0 +1,26 @@ +{ + "zh_CN": { + "dialogTitle" : "耳机接入通知", + "dialogMsg" : "请选择接入的设备类型(按ESC键取消)", + "btnHeadphone" : "耳机", + "btnLinein" : "线路输入", + "btnHeadset" : "耳麦", + "btnCancel" : "取消" + }, + "en_US": { + "dialogTitle" : "Combo Jack Selection", + "dialogMsg" : "Select your device type (Press ESC to cancel)", + "btnHeadphone" : "Headphones", + "btnLinein" : "Line-In", + "btnHeadset" : "Headset", + "btnCancel" : "Cancel" + }, + "vi_VN": { + "dialogTitle" : "Thông báo cắm tai nghe", + "dialogMsg" : "Lựa chọn loại thiết bị được cắm vào? (Bấm ESC để huỷ)", + "btnHeadphone" : "Tai nghe thường", + "btnLinein" : "Microphone", + "btnHeadset" : "Tai nghe có mic", + "btnCancel" : "Huỷ" + } +} diff --git a/ComboJack_Source/Combo Jack/PCI.h b/ComboJack_Source/Combo Jack/PCI.h new file mode 100644 index 0000000..1c2e8c5 --- /dev/null +++ b/ComboJack_Source/Combo Jack/PCI.h @@ -0,0 +1,71 @@ +// +// pci.h +// DPCIManager +// +// Created by PHPdev32 on 10/8/12. +// Licensed under GPLv3, full text at http://www.gnu.org/licenses/gpl-3.0.txt +// + +#import +#import + +@interface pciDevice : NSObject + +@property uint64_t entryID; +@property NSNumber *shadowVendor; +@property NSNumber *shadowDevice; +@property NSNumber *revision; +@property NSArray *bus; +@property NSNumber *vendor; +@property NSNumber *device; +@property NSNumber *subVendor; +@property NSNumber *subDevice; +@property NSNumber *pciClassCode; +@property NSNumber *pciClass; +@property NSNumber *pciSubClass; +@property NSString *vendorString; +@property NSString *deviceString; +@property NSString *classString; +@property NSString *subClassString; +@property (readonly) NSString *fullClassString; +@property (readonly) NSString *lspciString; +@property (readonly) NSDictionary *lspciDictionary; +@property (readonly) long fullID; +@property (readonly) long fullSubID; +@property (readonly) short bdf; + ++(long)nameToLong:(NSString *)name; ++(bool)isPCI:(io_service_t)service; ++(NSNumber *)grabNumber:(CFStringRef)entry forService:(io_service_t)service; ++(NSString *)grabString:(CFStringRef)entry forService:(io_service_t)service; ++(NSDictionary *)match:(pciDevice *)pci; ++(pciDevice *)create:(io_service_t)service classes:(NSMutableDictionary *)classes vendors:(NSMutableDictionary *)vendors; ++(pciDevice *)create:(io_service_t)service; ++(NSArray *)readIDs; + +@end + +@interface pciVendor : NSObject +@property NSString *name; +@property NSMutableDictionary *devices; ++(pciVendor *)create:(NSString *)name; +@end + +@interface pciClass : NSObject +@property NSString *name; +@property NSMutableDictionary *subClasses; ++(pciClass *)create:(NSString *)name; +@end + +@interface efiObject : NSObject +@property NSDictionary *properties; +@property pciDevice *device; ++(efiObject *)create:(pciDevice *)device injecting:(NSDictionary *)properties; ++(NSString *)stringWithArray:(NSArray *)array; +@end + +@interface hexFormatter : NSValueTransformer ++(BOOL)allowsReverseTransformation; ++(Class)transformedValueClass; +-(id)transformedValue:(id)value; +@end diff --git a/ComboJack_Source/Combo Jack/PCI.m b/ComboJack_Source/Combo Jack/PCI.m new file mode 100644 index 0000000..fe16c64 --- /dev/null +++ b/ComboJack_Source/Combo Jack/PCI.m @@ -0,0 +1,339 @@ +// +// pci.m +// DPCIManager +// +// Created by PHPdev32 on 10/8/12. +// Licensed under GPLv3, full text at http://www.gnu.org/licenses/gpl-3.0.txt +// + +#import "PCI.h" +#import "Tables.h" +#define h64tob32(x) (unsigned)(CFSwapInt64HostToBig(x)>>32) +#define strHexDec(x) strtol([x UTF8String], NULL, 16) + +#pragma mark Device Class +@implementation pciDevice + +@synthesize vendor; +@synthesize device; +@synthesize subVendor; +@synthesize subDevice; +@synthesize pciClassCode; +@synthesize pciClass; +@synthesize pciSubClass; +@synthesize bus; +@synthesize revision; +@synthesize shadowDevice; +@synthesize shadowVendor; +@synthesize vendorString; +@synthesize deviceString; +@synthesize classString; +@synthesize subClassString; + ++(long)nameToLong:(NSString *)name{ + if (![name hasPrefix:@"pci"] || [name rangeOfString:@","].location == NSNotFound) return 0; + NSArray *temp = [[name stringByReplacingOccurrencesOfString:@"pci" withString:@""] componentsSeparatedByString:@","]; + return strHexDec([temp objectAtIndex:1]) << 16 | strHexDec([temp objectAtIndex:0]); +} ++(bool)isPCI:(io_service_t)service{ + return [@"IOPCIDevice" isEqualToString:(__bridge_transfer NSString *)IOObjectCopyClass(service)]; +} ++(NSNumber *)grabNumber:(CFStringRef)entry forService:(io_service_t)service{//FIXME: shift bridge + id number = (__bridge_transfer id)IORegistryEntryCreateCFProperty(service, entry, kCFAllocatorDefault, 0); + NSNumber *temp = @0; + if (!number) return temp; + if ([number isKindOfClass:[NSNumber class]]) return number; + else if ([number isKindOfClass:[NSData class]]) + temp = @(*(NSInteger *)[number bytes]); + return temp; +} ++(NSString *)grabString:(CFStringRef)entry forService:(io_service_t)service{ + id string = (__bridge_transfer id)IORegistryEntryCreateCFProperty(service, entry, kCFAllocatorDefault, 0); + NSString *temp = @""; + if (!string) return temp; + if ([string isKindOfClass:[NSString class]]) return string; + else if ([string isKindOfClass:[NSData class]]) + if (!(temp = [[NSString alloc] initWithData:string encoding:NSUTF8StringEncoding])) + temp = [[NSString alloc] initWithData:string encoding:NSASCIIStringEncoding]; + return temp; +} ++(NSDictionary *)match:(pciDevice *)pci{ + NSInteger vendor = pci.vendor.integerValue; + NSInteger device = pci.device.integerValue; + return @{@kIOPropertyMatchKey:@{@"vendor-id":[NSData dataWithBytes:&vendor length:4], @"device-id":[NSData dataWithBytes:&device length:4]}}; +} ++(pciDevice *)create:(io_service_t)service classes:(NSMutableDictionary *)classes vendors:(NSMutableDictionary *)vendors{ + pciDevice *temp = [pciDevice create:service]; + temp.vendorString = [[vendors objectForKey:temp.shadowVendor] name]; + temp.deviceString = [[[vendors objectForKey:temp.shadowVendor] devices] objectForKey:temp.shadowDevice]; + temp.classString = [[classes objectForKey:temp.pciClass] name]; + temp.subClassString = [[[classes objectForKey:temp.pciClass] subClasses] objectForKey:temp.pciSubClass]; + return temp; +} ++(pciDevice *)create:(io_service_t)service{//FIXME: add validator option? + pciDevice *temp = [pciDevice new];//!!!: agreements are base&compat, sub&compatsub, IOName&name + @try { + IORegistryEntryGetRegistryEntryID(service, &temp->_entryID); + temp.vendor = [self grabNumber:CFSTR("vendor-id") forService:service]; + temp.device = [self grabNumber:CFSTR("device-id") forService:service]; + temp.bus = [[[[pciDevice grabString:CFSTR("pcidebug") forService:service] stringByReplacingOccurrencesOfString:@"(" withString:@":"] componentsSeparatedByString:@":"] valueForKey:@"integerValue"]; + if (![pciDevice isPCI:service]) [NSException raise:@"notpci" format:@"Not a real pci device!"]; + temp.subVendor = [self grabNumber:CFSTR("subsystem-vendor-id") forService:service]; + temp.subDevice = [self grabNumber:CFSTR("subsystem-id") forService:service]; + temp.pciClassCode = [self grabNumber:CFSTR("class-code") forService:service]; + temp.pciClass = @((temp.pciClassCode.integerValue >> 16) &0xFF); + temp.pciSubClass = @((temp.pciClassCode.integerValue >> 8) &0xFF); + temp.revision = [self grabNumber:CFSTR("revision-id") forService:service]; + long ids = 0; + NSString *string = [pciDevice grabString:CFSTR("IOName") forService:service]; + if (string.length) ids = [self nameToLong:string]; + //else [NSException raise:@"noioname" format:@"Missing IOName"]; + if (!ids) { + string = [pciDevice grabString:CFSTR("name") forService:service]; + if (string.length) ids = [self nameToLong:string]; + //else [NSException raise:@"noioname" format:@"Missing name"]; + } + temp.shadowVendor = !ids?temp.vendor:@(ids & 0xFFFF); + temp.shadowDevice = !ids?temp.device:@(ids >> 16); + } + @catch (NSException *e) { + //NSRunCriticalAlertPanel(@"PCI Error", @"%@ 0x%04X%04X", nil, nil, nil, e.reason, temp.vendor.intValue, temp.device.intValue); + temp.vendor = temp.device = temp.subVendor = temp.subDevice = temp.pciClassCode = temp.pciClass = temp.pciSubClass = temp.revision = temp.shadowVendor = temp.shadowDevice = @0; + temp.bus = @[temp.vendor, temp.vendor, temp.vendor]; + } + @finally { + return temp; + } +} +-(NSString *)fullClassString{ + return [NSString stringWithFormat:@"%@, %@", classString, subClassString]; +} +-(NSString *)lspciString{ + return [NSString stringWithFormat:@"%02lx:%02lx.%01lx %@ [%04lx]: %@ %@ [%04lx:%04lx]%@%@", [[bus objectAtIndex:0] integerValue], [[bus objectAtIndex:1] integerValue], [[bus objectAtIndex:2] integerValue], subClassString, pciClassCode.integerValue>>8, vendorString, deviceString, shadowVendor.integerValue, shadowDevice.integerValue, !revision.integerValue?@"":[NSString stringWithFormat:@" (rev %02lx)", revision.integerValue], !subDevice.integerValue?@"":[NSString stringWithFormat:@" (subsys %04lx:%04lx)", subVendor.integerValue, subDevice.integerValue]]; +} +-(NSDictionary *)lspciDictionary{ + NSDictionary *lspci_dict = @{ + // BusNumber:DeviceNumber.FunctionNumber + @"BDF": [NSString stringWithFormat:@"%02lx:%02lx.%01lx", [[bus objectAtIndex:0] integerValue], [[bus objectAtIndex:1] integerValue], [[bus objectAtIndex:2] integerValue]], + // Device's Class + @"Class": @{ + @"ClassName": [NSString stringWithFormat:@"%@", classString], + @"SubclassName": [NSString stringWithFormat:@"%@", subClassString], + @"ID": [NSString stringWithFormat:@"%04lx", pciClassCode.integerValue>>8] + }, + // Device Info + @"Info": @{ + @"Name": [NSString stringWithFormat:@"%@", deviceString], + @"Vendor": [NSString stringWithFormat:@"%@", vendorString] + }, + // Device ID + @"ID": @{ + @"DeviceID": [NSString stringWithFormat:@"%04lx", shadowDevice.integerValue], + @"VendorID": [NSString stringWithFormat:@"%04lx", shadowVendor.integerValue] + }, + // Subsystem ID + @"SubsysID": @{ + @"DeviceID": [NSString stringWithFormat:@"%04lx", subDevice.integerValue], + @"VendorID": [NSString stringWithFormat:@"%04lx", subVendor.integerValue] + }, + // Revision + @"Rev": [NSString stringWithFormat:@"%02lx", revision.integerValue] + }; + return lspci_dict; +} +-(long)fullID{ + return device.integerValue<<16 | vendor.integerValue; +} +-(long)fullSubID{ + return subDevice.integerValue<<16 | subVendor.integerValue; +} +-(short)bdf { + if (self.bus.count > 2) + return [[self.bus objectAtIndex:0] unsignedCharValue] << 8 | [[self.bus objectAtIndex:1] unsignedCharValue] << 3 | [[self.bus objectAtIndex:2] unsignedCharValue]; + return -1; +} + ++(NSArray *)readIDs{ + FILE *handle = fopen([[NSBundle.mainBundle pathForResource:@"pci" ofType:@"ids"] fileSystemRepresentation], "rb"); + NSMutableDictionary *classes = [NSMutableDictionary dictionary]; + NSMutableDictionary *vendors = [NSMutableDictionary dictionary]; + NSNumber *currentClass; + NSNumber *currentVendor; + char buffer[LINE_MAX]; + long device_id, subclass_id; + char *buf; + bool class_parse = false; + while((buf = fgets(buffer, LINE_MAX, handle)) != NULL) { + if (buf[0] == '#' || strlen(buf) <= 4) continue; + buf[strlen(buf)-1]='\0'; + if (*buf == 'C') class_parse = true; + if (class_parse) { + if (*buf == '\t') { + buf++; + if (*buf != '\t') { + subclass_id = strtol(buf, NULL, 16); + buf += 4; + while (*buf == ' ' || *buf == '\t') buf++; + [[[classes objectForKey:currentClass] subClasses] setObject:@(buf) forKey:@(subclass_id)]; + } + } + else if (*buf == 'C') { + buf += 2; + currentClass = @(strtol(buf, NULL, 16)); + buf += 4; + while (*buf == ' ' || *buf == '\t') buf++; + [classes setObject:[pciClass create:@(buf)] forKey:currentClass]; + } + } + else { + if (*buf == '\t') { + buf++; + if (*buf != '\t') { + device_id = strtol(buf, NULL, 16); + buf += 4; + while (*buf == ' ' || *buf == '\t') buf++; + [[[vendors objectForKey:currentVendor] devices] setObject:@(buf) forKey:@(device_id)]; + } + } + else if (*buf != '\\') { + currentVendor = @(strtol(buf, NULL, 16)); + buf += 4; + while (*buf == ' ' || *buf == '\t') buf++; + [vendors setObject:[pciVendor create:@(buf)] forKey:currentVendor]; + } + } + } + fclose(handle); + NSMutableArray *pcis = [NSMutableArray array]; + io_iterator_t itThis; + if (IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IOPCIDevice"), &itThis) == KERN_SUCCESS) { + io_service_t service; + while((service = IOIteratorNext(itThis))){ + pciDevice *pci = [pciDevice create:service classes:classes vendors:vendors]; + if (pci.fullID+pci.fullSubID > 0) [pcis addObject:pci]; + IOObjectRelease(service); + } + IOObjectRelease(itThis); + } + return [pcis copy]; +} +@end + +#pragma mark ID Classes +@implementation pciVendor +@synthesize name; +@synthesize devices; ++(pciVendor *)create:(NSString *)name{ + pciVendor *temp = [pciVendor new]; + temp.name = name; + temp.devices = [NSMutableDictionary dictionary]; + return temp; +} +@end + +@implementation pciClass +@synthesize name; +@synthesize subClasses; ++(pciClass *)create:(NSString *)name{ + pciClass *temp = [pciClass new]; + temp.name = name; + temp.subClasses = [NSMutableDictionary dictionary]; + return temp; +} +@end + +@implementation efiObject +@synthesize properties; +@synthesize device; ++(efiObject *)create:(pciDevice *)device injecting:(NSDictionary *)properties{ + efiObject *temp = [efiObject new]; + temp.properties = properties; + temp.device = device; + return temp; +} ++(NSString *)stringWithArray:(NSArray *)array{ + NSMutableString *str = [NSMutableString stringWithFormat:@"%08x%08x", CFSwapInt32HostToBig(1), h64tob32(array.count)]; + for (efiObject *obj in array) { + NSMutableString *efi = [NSMutableString stringWithFormat:@"%08x", 0x7fff0400]; + io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, (__bridge_retained CFDictionaryRef)[pciDevice match:obj.device]); + while (true) { + NSString *property; + if ((property = [pciDevice grabString:CFSTR("pcidebug") forService:service]) && property.length) { + NSArray *bus = [[[property stringByReplacingOccurrencesOfString:@"(" withString:@":"] componentsSeparatedByString:@":"] valueForKey:@"integerValue"]; + [efi insertString:[NSString stringWithFormat:@"%08x%02x%02x", 0x01010600, [[bus objectAtIndex:2] intValue], [[bus objectAtIndex:1] intValue]] atIndex:0]; + } + else if ((property = [pciDevice grabString:CFSTR("name") forService:service]).length) { + unsigned pnp = 0; + sscanf(property.UTF8String, "PNP%X", &pnp); + if (!pnp) { + efi = nil; + break; + } + if (!(property = [pciDevice grabString:CFSTR("_UID") forService:service]).length) property = @"0"; + unsigned uid = property.intValue; + [efi insertString:[NSString stringWithFormat:@"%08x%04x%04x%08x", 0x02010C00, 0xD041, CFSwapInt16HostToBig(pnp), CFSwapInt32HostToBig(uid)] atIndex:0]; + break; + } + io_service_t parent; + IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent); + IOObjectRelease(service); + service = parent; + } + IOObjectRelease(service); + if (!efi) return nil; + for(NSString *property in obj.properties) { + NSUInteger i = 0, j = property.length+1; + [efi appendFormat:@"%08x", h64tob32(4+j*2)]; + const char *prop = property.UTF8String; + while (i>(64-i*8)]; + } + [str appendFormat:@"%08x%08x%@", h64tob32(8+efi.length/2), h64tob32(obj.properties.count), efi]; + } + return [NSString stringWithFormat:@"%08x%@", h64tob32(4+str.length/2), str]; +} ++(int)NumberSize:(NSNumber *)number { + switch (number.objCType[0]) { + case 'c': + return sizeof(char); + case 'i': + return sizeof(int); + case 's': + return sizeof(short); + case 'l': + return sizeof(long); + case 'q': + return sizeof(long long); + case 'f': + return sizeof(float); + case 'd': + return sizeof(double); + case 'C': + return sizeof(unsigned char); + case 'I': + return sizeof(unsigned int); + case 'S': + return sizeof(unsigned short); + case 'L': + return sizeof(unsigned long); + case 'Q': + return sizeof(unsigned long long); + default: + return 0; + } +} +@end + +#pragma mark Formatter +@implementation hexFormatter ++(BOOL)allowsReverseTransformation{ + return false; +} ++(Class)transformedValueClass{ + return [NSString class]; +} +-(id)transformedValue:(id)value{ + return [NSString stringWithFormat:@"%04lX", [(NSNumber *)value integerValue]]; +} +@end diff --git a/ComboJack_Source/Combo Jack/Tables.h b/ComboJack_Source/Combo Jack/Tables.h new file mode 100644 index 0000000..7670c60 --- /dev/null +++ b/ComboJack_Source/Combo Jack/Tables.h @@ -0,0 +1,653 @@ +// +// Tables.h +// DPCIManager +// +// Created by PHPdev32 on 9/16/12. +// + +#ifndef DPCIManager_Tables_h +#define DPCIManager_Tables_h + +#define CODEC_ID(vendor,device) ((((UInt32) vendor & 0xffff) << 16) | \ +((UInt32) device & 0xffff)) + +#define HDA_DEV_MATCH(fl, v) ((fl) == (v) || (fl) == 0xffffffff || \ +(((fl) & 0xffff0000) == 0xffff0000 && ((fl) & 0x0000ffff) == ((v) & 0x0000ffff)) || \ +(((fl) & 0x0000ffff) == 0x0000ffff && ((fl) & 0xffff0000) == ((v) & 0xffff0000))) + +/* All codecs you can eat... */ +#define HDA_CODEC_CONSTRUCT(vendor, id) (((UInt32) (vendor##_VENDORID) << 16) | ((id) & 0xffff)) + +// +// Laptop codecs have a comment "Laptop" beside them, both has "Both" +// + +/* Cirrus Logic */ +#define CIRRUSLOGIC_VENDORID 0x1013 +#define HDA_CODEC_CS4206 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4206) +#define HDA_CODEC_CS4207 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4207) +#define HDA_CODEC_CS4210 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4210) +#define HDA_CODEC_CSXXXX HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0xffff) + +/* Realtek */ +#define REALTEK_VENDORID 0x10ec +#define HDA_CODEC_ALC221 HDA_CODEC_CONSTRUCT(REALTEK, 0x0221) +#define HDA_CODEC_ALC230 HDA_CODEC_CONSTRUCT(REALTEK, 0x0230) // new Laptop (rev 0x0002) +#define HDA_CODEC_ALC233 HDA_CODEC_CONSTRUCT(REALTEK, 0x0233) // new Both +#define HDA_CODEC_ALC235 HDA_CODEC_CONSTRUCT(REALTEK, 0x0235) // new Laptop +#define HDA_CODEC_ALC255 HDA_CODEC_CONSTRUCT(REALTEK, 0x0255) // new Laptop (rev 0x0000) +#define HDA_CODEC_ALC256 HDA_CODEC_CONSTRUCT(REALTEK, 0x0256) // new Laptop (rev 0x0002) +#define HDA_CODEC_ALC260 HDA_CODEC_CONSTRUCT(REALTEK, 0x0260) +#define HDA_CODEC_ALC262 HDA_CODEC_CONSTRUCT(REALTEK, 0x0262) +#define HDA_CODEC_ALC267 HDA_CODEC_CONSTRUCT(REALTEK, 0x0267) +#define HDA_CODEC_ALC268 HDA_CODEC_CONSTRUCT(REALTEK, 0x0268) // Both +#define HDA_CODEC_ALC269 HDA_CODEC_CONSTRUCT(REALTEK, 0x0269) // Both +#define HDA_CODEC_ALC270 HDA_CODEC_CONSTRUCT(REALTEK, 0x0270) // Both +#define HDA_CODEC_ALC272 HDA_CODEC_CONSTRUCT(REALTEK, 0x0272) // Both +#define HDA_CODEC_ALC273 HDA_CODEC_CONSTRUCT(REALTEK, 0x0273) +#define HDA_CODEC_ALC275 HDA_CODEC_CONSTRUCT(REALTEK, 0x0275) +#define HDA_CODEC_ALC276 HDA_CODEC_CONSTRUCT(REALTEK, 0x0276) +#define HDA_CODEC_ALC282 HDA_CODEC_CONSTRUCT(REALTEK, 0x0282) // new +#define HDA_CODEC_ALC292 HDA_CODEC_CONSTRUCT(REALTEK, 0x0292) // new +#define HDA_CODEC_ALC295 HDA_CODEC_CONSTRUCT(REALTEK, 0x0295) // new +#define HDA_CODEC_ALC660 HDA_CODEC_CONSTRUCT(REALTEK, 0x0660) +#define HDA_CODEC_ALC662 HDA_CODEC_CONSTRUCT(REALTEK, 0x0662) +#define HDA_CODEC_ALC663 HDA_CODEC_CONSTRUCT(REALTEK, 0x0663) +#define HDA_CODEC_ALC665 HDA_CODEC_CONSTRUCT(REALTEK, 0x0665) +#define HDA_CODEC_ALC670 HDA_CODEC_CONSTRUCT(REALTEK, 0x0670) +#define HDA_CODEC_ALC680 HDA_CODEC_CONSTRUCT(REALTEK, 0x0680) +#define HDA_CODEC_ALC861 HDA_CODEC_CONSTRUCT(REALTEK, 0x0861) +#define HDA_CODEC_ALC861VD HDA_CODEC_CONSTRUCT(REALTEK, 0x0862) +#define HDA_CODEC_ALC880 HDA_CODEC_CONSTRUCT(REALTEK, 0x0880) +#define HDA_CODEC_ALC882 HDA_CODEC_CONSTRUCT(REALTEK, 0x0882) +#define HDA_CODEC_ALC883 HDA_CODEC_CONSTRUCT(REALTEK, 0x0883) +#define HDA_CODEC_ALC885 HDA_CODEC_CONSTRUCT(REALTEK, 0x0885) +#define HDA_CODEC_ALC887 HDA_CODEC_CONSTRUCT(REALTEK, 0x0887) +#define HDA_CODEC_ALC888 HDA_CODEC_CONSTRUCT(REALTEK, 0x0888) +#define HDA_CODEC_ALC889 HDA_CODEC_CONSTRUCT(REALTEK, 0x0889) +#define HDA_CODEC_ALC891 HDA_CODEC_CONSTRUCT(REALTEK, 0x0891) // new +#define HDA_CODEC_ALC892 HDA_CODEC_CONSTRUCT(REALTEK, 0x0892) +#define HDA_CODEC_ALC898 HDA_CODEC_CONSTRUCT(REALTEK, 0x0899) +#define HDA_CODEC_ALC899 HDA_CODEC_CONSTRUCT(REALTEK, 0x0899) // new +#define HDA_CODEC_ALC1150 HDA_CODEC_CONSTRUCT(REALTEK, 0x0900) +#define HDA_CODEC_ALCS1220A HDA_CODEC_CONSTRUCT(REALTEK, 0x1168) // new (Asus) +#define HDA_CODEC_ALC1220 HDA_CODEC_CONSTRUCT(REALTEK, 0x1220) // new +#define HDA_CODEC_ALCXXXX HDA_CODEC_CONSTRUCT(REALTEK, 0xffff) + +/* Motorola */ +#define MOTO_VENDORID 0x1057 +#define HDA_CODEC_MOTOXXXX HDA_CODEC_CONSTRUCT(MOTO, 0xffff) + +/* Creative */ +#define CREATIVE_VENDORID 0x1102 +#define HDA_CODEC_CA0110 HDA_CODEC_CONSTRUCT(CREATIVE, 0x000a) +#define HDA_CODEC_CA0110_2 HDA_CODEC_CONSTRUCT(CREATIVE, 0x000b) +#define HDA_CODEC_SB0880 HDA_CODEC_CONSTRUCT(CREATIVE, 0x000d) +#define HDA_CODEC_CA0132 HDA_CODEC_CONSTRUCT(CREATIVE, 0x0011) +#define HDA_CODEC_CAXXXX HDA_CODEC_CONSTRUCT(CREATIVE, 0xffff) + +/* Analog Devices */ +#define ANALOGDEVICES_VENDORID 0x11d4 +#define HDA_CODEC_AD1884A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x184a) +#define HDA_CODEC_AD1882 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1882) +#define HDA_CODEC_AD1883 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1883) +#define HDA_CODEC_AD1884 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1884) +#define HDA_CODEC_AD1984A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194a) +#define HDA_CODEC_AD1984B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194b) +#define HDA_CODEC_AD1981HD HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1981) +#define HDA_CODEC_AD1983 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1983) +#define HDA_CODEC_AD1984 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1984) +#define HDA_CODEC_AD1986A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1986) +#define HDA_CODEC_AD1987 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1987) +#define HDA_CODEC_AD1988 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1988) +#define HDA_CODEC_AD1988B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x198b) +#define HDA_CODEC_AD1882A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x882a) +#define HDA_CODEC_AD1989A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989a) +#define HDA_CODEC_AD1989B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989b) +#define HDA_CODEC_ADXXXX HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0xffff) + +/* CMedia */ +#define CMEDIA_VENDORID 0x13f6 +#define HDA_CODEC_CMI9880 HDA_CODEC_CONSTRUCT(CMEDIA, 0x9880) +#define HDA_CODEC_CMIXXXX HDA_CODEC_CONSTRUCT(CMEDIA, 0xffff) + +#define CMEDIA2_VENDORID 0x434d +#define HDA_CODEC_CMI98802 HDA_CODEC_CONSTRUCT(CMEDIA2, 0x4980) +#define HDA_CODEC_CMIXXXX2 HDA_CODEC_CONSTRUCT(CMEDIA2, 0xffff) + +/* Sigmatel */ +#define SIGMATEL_VENDORID 0x8384 +#define HDA_CODEC_STAC9230X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7612) +#define HDA_CODEC_STAC9230D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7613) +#define HDA_CODEC_STAC9229X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7614) +#define HDA_CODEC_STAC9229D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7615) +#define HDA_CODEC_STAC9228X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7616) +#define HDA_CODEC_STAC9228D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7617) +#define HDA_CODEC_STAC9227X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618) +#define HDA_CODEC_STAC9227D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7619) +#define HDA_CODEC_STAC9274 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7620) +#define HDA_CODEC_STAC9274D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7621) +#define HDA_CODEC_STAC9273X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7622) +#define HDA_CODEC_STAC9273D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7623) +#define HDA_CODEC_STAC9272X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7624) +#define HDA_CODEC_STAC9272D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7625) +#define HDA_CODEC_STAC9271X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7626) +#define HDA_CODEC_STAC9271D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627) +#define HDA_CODEC_STAC9274X5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7628) +#define HDA_CODEC_STAC9274D5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7629) +#define HDA_CODEC_STAC9250 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7634) +#define HDA_CODEC_STAC9251 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7636) +#define HDA_CODEC_IDT92HD700X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7638) +#define HDA_CODEC_IDT92HD700D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639) +#define HDA_CODEC_IDT92HD206X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645) +#define HDA_CODEC_IDT92HD206D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646) +#define HDA_CODEC_CXD9872RDK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7661) +#define HDA_CODEC_STAC9872AK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662) +#define HDA_CODEC_CXD9872AKD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7664) +#define HDA_CODEC_STAC9221 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680) +#define HDA_CODEC_STAC922XD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681) +#define HDA_CODEC_STAC9221_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682) +#define HDA_CODEC_STAC9221D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7683) +#define HDA_CODEC_STAC9220 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7690) +#define HDA_CODEC_STAC9200D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7691) +#define HDA_CODEC_IDT92HD005 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7698) +#define HDA_CODEC_IDT92HD005D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7699) +#define HDA_CODEC_STAC9205X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0) +#define HDA_CODEC_STAC9205D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a1) +#define HDA_CODEC_STAC9204X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a2) +#define HDA_CODEC_STAC9204D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a3) +#define HDA_CODEC_STAC9255 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a4) +#define HDA_CODEC_STAC9255D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a5) +#define HDA_CODEC_STAC9254 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a6) +#define HDA_CODEC_STAC9254D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a7) +#define HDA_CODEC_STAC9220_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7880) +#define HDA_CODEC_STAC9220_A1 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7882) +#define HDA_CODEC_STACXXXX HDA_CODEC_CONSTRUCT(SIGMATEL, 0xffff) + +/* IDT */ +#define IDT_VENDORID 0x111d +#define HDA_CODEC_IDT92HD75BX HDA_CODEC_CONSTRUCT(IDT, 0x7603) +#define HDA_CODEC_IDT92HD83C1X HDA_CODEC_CONSTRUCT(IDT, 0x7604) +#define HDA_CODEC_IDT92HD81B1X HDA_CODEC_CONSTRUCT(IDT, 0x7605) +#define HDA_CODEC_IDT92HD75B3 HDA_CODEC_CONSTRUCT(IDT, 0x7608) +#define HDA_CODEC_IDT92HD73D1 HDA_CODEC_CONSTRUCT(IDT, 0x7674) +#define HDA_CODEC_IDT92HD73C1 HDA_CODEC_CONSTRUCT(IDT, 0x7675) +#define HDA_CODEC_IDT92HD73E1 HDA_CODEC_CONSTRUCT(IDT, 0x7676) +#define HDA_CODEC_IDTID7695 HDA_CODEC_CONSTRUCT(IDT, 0x7695) // new +#define HDA_CODEC_IDT92HD71B8 HDA_CODEC_CONSTRUCT(IDT, 0x76b0) +#define HDA_CODEC_IDT92HD71B8_2 HDA_CODEC_CONSTRUCT(IDT, 0x76b1) +#define HDA_CODEC_IDT92HD71B7 HDA_CODEC_CONSTRUCT(IDT, 0x76b2) +#define HDA_CODEC_IDT92HD71B7_2 HDA_CODEC_CONSTRUCT(IDT, 0x76b3) +#define HDA_CODEC_IDT92HD71B6 HDA_CODEC_CONSTRUCT(IDT, 0x76b4) +#define HDA_CODEC_IDT92HD71B6_2 HDA_CODEC_CONSTRUCT(IDT, 0x76b5) +#define HDA_CODEC_IDT92HD71B5 HDA_CODEC_CONSTRUCT(IDT, 0x76b6) +#define HDA_CODEC_IDT92HD71B5_2 HDA_CODEC_CONSTRUCT(IDT, 0x76b7) +#define HDA_CODEC_IDT92HD89C3 HDA_CODEC_CONSTRUCT(IDT, 0x76c0) +#define HDA_CODEC_IDT92HD89C2 HDA_CODEC_CONSTRUCT(IDT, 0x76c1) +#define HDA_CODEC_IDT92HD89C1 HDA_CODEC_CONSTRUCT(IDT, 0x76c2) +#define HDA_CODEC_IDT92HD89B3 HDA_CODEC_CONSTRUCT(IDT, 0x76c3) +#define HDA_CODEC_IDT92HD89B2 HDA_CODEC_CONSTRUCT(IDT, 0x76c4) +#define HDA_CODEC_IDT92HD89B1 HDA_CODEC_CONSTRUCT(IDT, 0x76c5) +#define HDA_CODEC_IDT92HD89E3 HDA_CODEC_CONSTRUCT(IDT, 0x76c6) +#define HDA_CODEC_IDT92HD89E2 HDA_CODEC_CONSTRUCT(IDT, 0x76c7) +#define HDA_CODEC_IDT92HD89E1 HDA_CODEC_CONSTRUCT(IDT, 0x76c8) +#define HDA_CODEC_IDT92HD89D3 HDA_CODEC_CONSTRUCT(IDT, 0x76c9) +#define HDA_CODEC_IDT92HD89D2 HDA_CODEC_CONSTRUCT(IDT, 0x76ca) +#define HDA_CODEC_IDT92HD89D1 HDA_CODEC_CONSTRUCT(IDT, 0x76cb) +#define HDA_CODEC_IDT92HD89F3 HDA_CODEC_CONSTRUCT(IDT, 0x76cc) +#define HDA_CODEC_IDT92HD89F2 HDA_CODEC_CONSTRUCT(IDT, 0x76cd) +#define HDA_CODEC_IDT92HD89F1 HDA_CODEC_CONSTRUCT(IDT, 0x76ce) +#define HDA_CODEC_IDT92HD87B1_3 HDA_CODEC_CONSTRUCT(IDT, 0x76d1) +#define HDA_CODEC_IDT92HD83C1C HDA_CODEC_CONSTRUCT(IDT, 0x76d4) +#define HDA_CODEC_IDT92HD81B1C HDA_CODEC_CONSTRUCT(IDT, 0x76d5) +#define HDA_CODEC_IDT92HD87B2_4 HDA_CODEC_CONSTRUCT(IDT, 0x76d9) +#define HDA_CODEC_IDT92HD93BXX HDA_CODEC_CONSTRUCT(IDT, 0x76df) +#define HDA_CODEC_IDT92HD91BXX HDA_CODEC_CONSTRUCT(IDT, 0x76e0) +#define HDA_CODEC_IDT92HD98BXX HDA_CODEC_CONSTRUCT(IDT, 0x76e3) +#define HDA_CODEC_IDT92HD99BXX HDA_CODEC_CONSTRUCT(IDT, 0x76e5) +#define HDA_CODEC_IDT92HD90BXX HDA_CODEC_CONSTRUCT(IDT, 0x76e7) +#define HDA_CODEC_IDT92HD66B1X5 HDA_CODEC_CONSTRUCT(IDT, 0x76e8) +#define HDA_CODEC_IDT92HD66B2X5 HDA_CODEC_CONSTRUCT(IDT, 0x76e9) +#define HDA_CODEC_IDT92HD66B3X5 HDA_CODEC_CONSTRUCT(IDT, 0x76ea) +#define HDA_CODEC_IDT92HD66C1X5 HDA_CODEC_CONSTRUCT(IDT, 0x76eb) +#define HDA_CODEC_IDT92HD66C2X5 HDA_CODEC_CONSTRUCT(IDT, 0x76ec) +#define HDA_CODEC_IDT92HD66C3X5 HDA_CODEC_CONSTRUCT(IDT, 0x76ed) +#define HDA_CODEC_IDT92HD66B1X3 HDA_CODEC_CONSTRUCT(IDT, 0x76ee) +#define HDA_CODEC_IDT92HD66B2X3 HDA_CODEC_CONSTRUCT(IDT, 0x76ef) +#define HDA_CODEC_IDT92HD66B3X3 HDA_CODEC_CONSTRUCT(IDT, 0x76f0) +#define HDA_CODEC_IDT92HD66C1X3 HDA_CODEC_CONSTRUCT(IDT, 0x76f1) +#define HDA_CODEC_IDT92HD66C2X3 HDA_CODEC_CONSTRUCT(IDT, 0x76f2) +#define HDA_CODEC_IDT92HD66C3_65 HDA_CODEC_CONSTRUCT(IDT, 0x76f3) +#define HDA_CODEC_IDTXXXX HDA_CODEC_CONSTRUCT(IDT, 0xffff) + +/* Silicon Image */ +#define SII_VENDORID 0x1095 +#define HDA_CODEC_SII1390 HDA_CODEC_CONSTRUCT(SII, 0x1390) +#define HDA_CODEC_SII1392 HDA_CODEC_CONSTRUCT(SII, 0x1392) +#define HDA_CODEC_SIIXXXX HDA_CODEC_CONSTRUCT(SII, 0xffff) + +/* Lucent/Agere */ +#define AGERE_VENDORID 0x11c1 +#define HDA_CODEC_AGEREXXXX HDA_CODEC_CONSTRUCT(AGERE, 0xffff) + +/* Conexant */ +#define CONEXANT_VENDORID 0x14f1 +#define HDA_CODEC_CX20549 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045) +#define HDA_CODEC_CX20551 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047) +#define HDA_CODEC_CX20561 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051) +#define HDA_CODEC_CX20582 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5066) +#define HDA_CODEC_CX20583 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5067) +#define HDA_CODEC_CX20584 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5068) +#define HDA_CODEC_CX20585 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5069) +#define HDA_CODEC_CX20588 HDA_CODEC_CONSTRUCT(CONEXANT, 0x506c) +#define HDA_CODEC_CX20590 HDA_CODEC_CONSTRUCT(CONEXANT, 0x506e) +#define HDA_CODEC_CX20631 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5097) +#define HDA_CODEC_CX20632 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5098) +#define HDA_CODEC_CX20641 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50a1) +#define HDA_CODEC_CX20642 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50a2) +#define HDA_CODEC_CX20651 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50ab) +#define HDA_CODEC_CX20652 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50ac) +#define HDA_CODEC_CX20664 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50b8) +#define HDA_CODEC_CX20665 HDA_CODEC_CONSTRUCT(CONEXANT, 0x50b9) +#define HDA_CODEC_CXXXXX HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff) + +/* VIA */ +#define VIA_VENDORID 0x1106 +#define HDA_CODEC_VT1708_8 HDA_CODEC_CONSTRUCT(VIA, 0x1708) +#define HDA_CODEC_VT1708_9 HDA_CODEC_CONSTRUCT(VIA, 0x1709) +#define HDA_CODEC_VT1708_A HDA_CODEC_CONSTRUCT(VIA, 0x170a) +#define HDA_CODEC_VT1708_B HDA_CODEC_CONSTRUCT(VIA, 0x170b) +#define HDA_CODEC_VT1709_0 HDA_CODEC_CONSTRUCT(VIA, 0xe710) +#define HDA_CODEC_VT1709_1 HDA_CODEC_CONSTRUCT(VIA, 0xe711) +#define HDA_CODEC_VT1709_2 HDA_CODEC_CONSTRUCT(VIA, 0xe712) +#define HDA_CODEC_VT1709_3 HDA_CODEC_CONSTRUCT(VIA, 0xe713) +#define HDA_CODEC_VT1709_4 HDA_CODEC_CONSTRUCT(VIA, 0xe714) +#define HDA_CODEC_VT1709_5 HDA_CODEC_CONSTRUCT(VIA, 0xe715) +#define HDA_CODEC_VT1709_6 HDA_CODEC_CONSTRUCT(VIA, 0xe716) +#define HDA_CODEC_VT1709_7 HDA_CODEC_CONSTRUCT(VIA, 0xe717) +#define HDA_CODEC_VT1708B_0 HDA_CODEC_CONSTRUCT(VIA, 0xe720) +#define HDA_CODEC_VT1708B_1 HDA_CODEC_CONSTRUCT(VIA, 0xe721) +#define HDA_CODEC_VT1708B_2 HDA_CODEC_CONSTRUCT(VIA, 0xe722) +#define HDA_CODEC_VT1708B_3 HDA_CODEC_CONSTRUCT(VIA, 0xe723) +#define HDA_CODEC_VT1708B_4 HDA_CODEC_CONSTRUCT(VIA, 0xe724) +#define HDA_CODEC_VT1708B_5 HDA_CODEC_CONSTRUCT(VIA, 0xe725) +#define HDA_CODEC_VT1708B_6 HDA_CODEC_CONSTRUCT(VIA, 0xe726) +#define HDA_CODEC_VT1708B_7 HDA_CODEC_CONSTRUCT(VIA, 0xe727) +#define HDA_CODEC_VT1708S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0397) +#define HDA_CODEC_VT1708S_1 HDA_CODEC_CONSTRUCT(VIA, 0x1397) +#define HDA_CODEC_VT1708S_2 HDA_CODEC_CONSTRUCT(VIA, 0x2397) +#define HDA_CODEC_VT1708S_3 HDA_CODEC_CONSTRUCT(VIA, 0x3397) +#define HDA_CODEC_VT1708S_4 HDA_CODEC_CONSTRUCT(VIA, 0x4397) +#define HDA_CODEC_VT1708S_5 HDA_CODEC_CONSTRUCT(VIA, 0x5397) +#define HDA_CODEC_VT1708S_6 HDA_CODEC_CONSTRUCT(VIA, 0x6397) +#define HDA_CODEC_VT1708S_7 HDA_CODEC_CONSTRUCT(VIA, 0x7397) +#define HDA_CODEC_VT1702_0 HDA_CODEC_CONSTRUCT(VIA, 0x0398) +#define HDA_CODEC_VT1702_1 HDA_CODEC_CONSTRUCT(VIA, 0x1398) +#define HDA_CODEC_VT1702_2 HDA_CODEC_CONSTRUCT(VIA, 0x2398) +#define HDA_CODEC_VT1702_3 HDA_CODEC_CONSTRUCT(VIA, 0x3398) +#define HDA_CODEC_VT1702_4 HDA_CODEC_CONSTRUCT(VIA, 0x4398) +#define HDA_CODEC_VT1702_5 HDA_CODEC_CONSTRUCT(VIA, 0x5398) +#define HDA_CODEC_VT1702_6 HDA_CODEC_CONSTRUCT(VIA, 0x6398) +#define HDA_CODEC_VT1702_7 HDA_CODEC_CONSTRUCT(VIA, 0x7398) +#define HDA_CODEC_VT1716S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0433) +#define HDA_CODEC_VT1716S_1 HDA_CODEC_CONSTRUCT(VIA, 0xa721) +#define HDA_CODEC_VT1718S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0428) +#define HDA_CODEC_VT1718S_1 HDA_CODEC_CONSTRUCT(VIA, 0x4428) +#define HDA_CODEC_VT1802_0 HDA_CODEC_CONSTRUCT(VIA, 0x0446) +#define HDA_CODEC_VT1802_1 HDA_CODEC_CONSTRUCT(VIA, 0x8446) +#define HDA_CODEC_VT1812 HDA_CODEC_CONSTRUCT(VIA, 0x0448) +#define HDA_CODEC_VT1818S HDA_CODEC_CONSTRUCT(VIA, 0x0440) +#define HDA_CODEC_VT1828S HDA_CODEC_CONSTRUCT(VIA, 0x4441) +#define HDA_CODEC_VT2002P_0 HDA_CODEC_CONSTRUCT(VIA, 0x0438) +#define HDA_CODEC_VT2002P_1 HDA_CODEC_CONSTRUCT(VIA, 0x4438) +#define HDA_CODEC_VT2020 HDA_CODEC_CONSTRUCT(VIA, 0x0441) +#define HDA_CODEC_VTXXXX HDA_CODEC_CONSTRUCT(VIA, 0xffff) + +/* ATI */ +#define ATI_VENDORID 0x1002 +#define HDA_CODEC_ATIRS600_1 HDA_CODEC_CONSTRUCT(ATI, 0x793c) +#define HDA_CODEC_ATIRS600_2 HDA_CODEC_CONSTRUCT(ATI, 0x7919) +#define HDA_CODEC_ATIRS690 HDA_CODEC_CONSTRUCT(ATI, 0x791a) +#define HDA_CODEC_ATIR6XX HDA_CODEC_CONSTRUCT(ATI, 0xaa01) +#define HDA_CODEC_ATIXXXX HDA_CODEC_CONSTRUCT(ATI, 0xffff) + +/* NVIDIA */ +#define NVIDIA_VENDORID 0x10de +#define HDA_CODEC_NVIDIAMCP78 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0002) +#define HDA_CODEC_NVIDIAMCP78_2 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0003) +#define HDA_CODEC_NVIDIAMCP78_3 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0005) +#define HDA_CODEC_NVIDIAMCP78_4 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0006) +#define HDA_CODEC_NVIDIAMCP7A HDA_CODEC_CONSTRUCT(NVIDIA, 0x0007) +#define HDA_CODEC_NVIDIAGT220 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000a) +#define HDA_CODEC_NVIDIAGT21X HDA_CODEC_CONSTRUCT(NVIDIA, 0x000b) +#define HDA_CODEC_NVIDIAMCP89 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000c) +#define HDA_CODEC_NVIDIAGT240 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000d) +#define HDA_CODEC_NVIDIAGTX470 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0010) +#define HDA_CODEC_NVIDIAGTS450 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0011) +#define HDA_CODEC_NVIDIAGT440 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0014) +#define HDA_CODEC_NVIDIAGTX550 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0015) +#define HDA_CODEC_NVIDIAGTX570 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0018) +#define HDA_CODEC_NVIDIAGT610 HDA_CODEC_CONSTRUCT(NVIDIA, 0x001c) // new +#define HDA_CODEC_NVIDIATEGRA30 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0020) // new +#define HDA_CODEC_NVIDIATEGRA114 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0022) // new +#define HDA_CODEC_NVIDIATEGRA124 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0028) // new +#define HDA_CODEC_NVIDIATEGRA210 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0029) // new +#define HDA_CODEC_NVIDIAGTX680 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0040) +#define HDA_CODEC_NVIDIAMCP67 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0067) +#define HDA_CODEC_NVIDIAMCP73 HDA_CODEC_CONSTRUCT(NVIDIA, 0x8001) +#define HDA_CODEC_NVIDIAXXXX HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff) + +/* Chrontel */ +#define CHRONTEL_VENDORID 0x17e8 +#define HDA_CODEC_CHXXXX HDA_CODEC_CONSTRUCT(CHRONTEL, 0xffff) + +/* INTEL */ +#define INTEL_VENDORID 0x8086 +#define HDA_CODEC_INTELIP HDA_CODEC_CONSTRUCT(INTEL, 0x0054) +#define HDA_CODEC_INTELBL HDA_CODEC_CONSTRUCT(INTEL, 0x2801) +#define HDA_CODEC_INTELCA HDA_CODEC_CONSTRUCT(INTEL, 0x2802) +#define HDA_CODEC_INTELEL HDA_CODEC_CONSTRUCT(INTEL, 0x2803) +#define HDA_CODEC_INTELIP2 HDA_CODEC_CONSTRUCT(INTEL, 0x2804) +#define HDA_CODEC_INTELCPT HDA_CODEC_CONSTRUCT(INTEL, 0x2805) +#define HDA_CODEC_INTELPPT HDA_CODEC_CONSTRUCT(INTEL, 0x2806) +#define HDA_CODEC_INTELHSW HDA_CODEC_CONSTRUCT(INTEL, 0x2807) // new +#define HDA_CODEC_INTELBDW HDA_CODEC_CONSTRUCT(INTEL, 0x2808) // new +#define HDA_CODEC_INTELSKLK HDA_CODEC_CONSTRUCT(INTEL, 0x2809) // new +#define HDA_CODEC_INTELKBLK HDA_CODEC_CONSTRUCT(INTEL, 0x280b) // new +#define HDA_CODEC_INTELCL HDA_CODEC_CONSTRUCT(INTEL, 0x29fb) +#define HDA_CODEC_INTELWB HDA_CODEC_CONSTRUCT(INTEL, 0x0a0c) // new +#define HDA_CODEC_INTELXXXX HDA_CODEC_CONSTRUCT(INTEL, 0xffff) + +// +// NOTE: I don't have all the revisions, I included only the ones that I know. +// Codec Name can be different based on revisions, but I have included only +// the codec names that I know. +// +static const struct {UInt32 id; UInt16 rev; char *name;} gCodecList[] = { + // Codec Constant Revision Codec Name + { HDA_CODEC_CS4206, 0x0000, "Cirrus Logic CS4206" }, + { HDA_CODEC_CS4207, 0x0000, "Cirrus Logic CS4207" }, + { HDA_CODEC_CS4210, 0x0000, "Cirrus Logic CS4210" }, + { HDA_CODEC_ALC221, 0x0000, "Realtek ALC221" }, + { HDA_CODEC_ALC260, 0x0000, "Realtek ALC260" }, + { HDA_CODEC_ALC262, 0x0000, "Realtek ALC262" }, + { HDA_CODEC_ALC267, 0x0000, "Realtek ALC267" }, + { HDA_CODEC_ALC268, 0x0000, "Realtek ALC268" }, + { HDA_CODEC_ALC268, 0x0003, "Realtek ALC268" }, + { HDA_CODEC_ALC268, 0x0101, "Realtek ALC268" }, + { HDA_CODEC_ALC269, 0x0000, "Realtek ALC269" }, + { HDA_CODEC_ALC269, 0x0004, "Realtek ALC269" }, + { HDA_CODEC_ALC269, 0x0100, "Realtek ALC269VB" }, + { HDA_CODEC_ALC269, 0x0202, "Realtek ALC269VC" }, + { HDA_CODEC_ALC269, 0x0203, "Realtek ALC269VC" }, + { HDA_CODEC_ALC270, 0x0000, "Realtek ALC270" }, + { HDA_CODEC_ALC270, 0x0100, "Realtek ALC270" }, + { HDA_CODEC_ALC272, 0x0000, "Realtek ALC272" }, + { HDA_CODEC_ALC272, 0x0001, "Realtek ALC272" }, + { HDA_CODEC_ALC273, 0x0000, "Realtek ALC273" }, + { HDA_CODEC_ALC275, 0x0000, "Realtek ALC275" }, + { HDA_CODEC_ALC276, 0x0000, "Realtek ALC276" }, + { HDA_CODEC_ALC660, 0x0000, "Realtek ALC660" }, + { HDA_CODEC_ALC662, 0x0000, "Realtek ALC662" }, + { HDA_CODEC_ALC662, 0x0002, "Realtek ALC662v2" }, + { HDA_CODEC_ALC663, 0x0000, "Realtek ALC663" }, + { HDA_CODEC_ALC665, 0x0000, "Realtek ALC665" }, + { HDA_CODEC_ALC670, 0x0000, "Realtek ALC670" }, + { HDA_CODEC_ALC680, 0x0000, "Realtek ALC680" }, + { HDA_CODEC_ALC861, 0x0000, "Realtek ALC861" }, + { HDA_CODEC_ALC861VD, 0x0000, "Realtek ALC861-VD" }, + { HDA_CODEC_ALC880, 0x0000, "Realtek ALC880" }, + { HDA_CODEC_ALC882, 0x0000, "Realtek ALC882" }, + { HDA_CODEC_ALC883, 0x0000, "Realtek ALC883" }, + { HDA_CODEC_ALC885, 0x0000, "Realtek ALC885" }, + { HDA_CODEC_ALC885, 0x0004, "Realtek ALC889A/ALC885" }, + { HDA_CODEC_ALC885, 0x0103, "Realtek ALC889A" }, + { HDA_CODEC_ALC885, 0x0101, "Realtek ALC889A" }, + { HDA_CODEC_ALC887, 0x0302, "Realtek ALC888B" }, + { HDA_CODEC_ALC887, 0x0002, "Realtek ALC887-VD2" }, + { HDA_CODEC_ALC887, 0x0001, "Realtek ALC887-VD" }, + { HDA_CODEC_ALC887, 0x0000, "Realtek ALC887" }, + { HDA_CODEC_ALC888, 0x0003, "Realtek ALC888S-VD" }, + { HDA_CODEC_ALC888, 0x0002, "Realtek ALC888S-VC" }, + { HDA_CODEC_ALC888, 0x0001, "Realtek ALC888S" }, + { HDA_CODEC_ALC888, 0x0000, "Realtek ALC888" }, + { HDA_CODEC_ALC889, 0x0000, "Realtek ALC889" }, + { HDA_CODEC_ALC892, 0x0000, "Realtek ALC892" }, + { HDA_CODEC_ALC898, 0x0000, "Realtek ALC898" }, + { HDA_CODEC_ALC1150, 0x0000, "Realtek ALC1150" }, + { HDA_CODEC_AD1882, 0x0000, "Analog Devices AD1882" }, + { HDA_CODEC_AD1882A, 0x0000, "Analog Devices AD1882A" }, + { HDA_CODEC_AD1883, 0x0000, "Analog Devices AD1883" }, + { HDA_CODEC_AD1884, 0x0000, "Analog Devices AD1884" }, + { HDA_CODEC_AD1884A, 0x0000, "Analog Devices AD1884A" }, + { HDA_CODEC_AD1981HD, 0x0000, "Analog Devices AD1981HD" }, + { HDA_CODEC_AD1983, 0x0000, "Analog Devices AD1983" }, + { HDA_CODEC_AD1984, 0x0000, "Analog Devices AD1984" }, + { HDA_CODEC_AD1984A, 0x0000, "Analog Devices AD1984A" }, + { HDA_CODEC_AD1984B, 0x0000, "Analog Devices AD1984B" }, + { HDA_CODEC_AD1986A, 0x0000, "Analog Devices AD1986A" }, + { HDA_CODEC_AD1987, 0x0000, "Analog Devices AD1987" }, + { HDA_CODEC_AD1988, 0x0000, "Analog Devices AD1988A" }, + { HDA_CODEC_AD1988B, 0x0000, "Analog Devices AD1988B" }, + { HDA_CODEC_AD1989A, 0x0000, "Analog Devices AD1989A" }, + { HDA_CODEC_AD1989B, 0x0000, "Analog Devices AD2000b" }, + { HDA_CODEC_CA0110, 0x0000, "Creative CA0110-IBG" }, + { HDA_CODEC_CA0110_2, 0x0000, "Creative CA0110-IBG" }, + { HDA_CODEC_CA0132, 0x0000, "Creative CA0132" }, + { HDA_CODEC_SB0880, 0x0000, "Creative SB0880 X-Fi" }, + { HDA_CODEC_CMI9880, 0x0000, "CMedia CMI9880" }, + { HDA_CODEC_CMI98802, 0x0000, "CMedia CMI9880" }, + { HDA_CODEC_CXD9872RDK, 0x0000, "Sigmatel CXD9872RD/K" }, + { HDA_CODEC_CXD9872AKD, 0x0000, "Sigmatel CXD9872AKD" }, + { HDA_CODEC_STAC9200D, 0x0000, "Sigmatel STAC9200D" }, + { HDA_CODEC_STAC9204X, 0x0000, "Sigmatel STAC9204X" }, + { HDA_CODEC_STAC9204D, 0x0000, "Sigmatel STAC9204D" }, + { HDA_CODEC_STAC9205X, 0x0000, "Sigmatel STAC9205X" }, + { HDA_CODEC_STAC9205D, 0x0000, "Sigmatel STAC9205D" }, + { HDA_CODEC_STAC9220, 0x0000, "Sigmatel STAC9220" }, + { HDA_CODEC_STAC9220_A1, 0x0000, "Sigmatel STAC9220_A1" }, + { HDA_CODEC_STAC9220_A2, 0x0000, "Sigmatel STAC9220_A2" }, + { HDA_CODEC_STAC9221, 0x0000, "Sigmatel STAC9221" }, + { HDA_CODEC_STAC9221_A2, 0x0000, "Sigmatel STAC9221_A2" }, + { HDA_CODEC_STAC9221D, 0x0000, "Sigmatel STAC9221D" }, + { HDA_CODEC_STAC922XD, 0x0000, "Sigmatel STAC9220D/9223D" }, + { HDA_CODEC_STAC9227X, 0x0000, "Sigmatel STAC9227X" }, + { HDA_CODEC_STAC9227D, 0x0000, "Sigmatel STAC9227D" }, + { HDA_CODEC_STAC9228X, 0x0000, "Sigmatel STAC9228X" }, + { HDA_CODEC_STAC9228D, 0x0000, "Sigmatel STAC9228D" }, + { HDA_CODEC_STAC9229X, 0x0000, "Sigmatel STAC9229X" }, + { HDA_CODEC_STAC9229D, 0x0000, "Sigmatel STAC9229D" }, + { HDA_CODEC_STAC9230X, 0x0000, "Sigmatel STAC9230X" }, + { HDA_CODEC_STAC9230D, 0x0000, "Sigmatel STAC9230D" }, + { HDA_CODEC_STAC9250, 0x0000, "Sigmatel STAC9250" }, + { HDA_CODEC_STAC9251, 0x0000, "Sigmatel STAC9251" }, + { HDA_CODEC_STAC9255, 0x0000, "Sigmatel STAC9255" }, + { HDA_CODEC_STAC9255D, 0x0000, "Sigmatel STAC9255D" }, + { HDA_CODEC_STAC9254, 0x0000, "Sigmatel STAC9254" }, + { HDA_CODEC_STAC9254D, 0x0000, "Sigmatel STAC9254D" }, + { HDA_CODEC_STAC9271X, 0x0000, "Sigmatel STAC9271X" }, + { HDA_CODEC_STAC9271D, 0x0000, "Sigmatel STAC9271D" }, + { HDA_CODEC_STAC9272X, 0x0000, "Sigmatel STAC9272X" }, + { HDA_CODEC_STAC9272D, 0x0000, "Sigmatel STAC9272D" }, + { HDA_CODEC_STAC9273X, 0x0000, "Sigmatel STAC9273X" }, + { HDA_CODEC_STAC9273D, 0x0000, "Sigmatel STAC9273D" }, + { HDA_CODEC_STAC9274, 0x0000, "Sigmatel STAC9274" }, + { HDA_CODEC_STAC9274D, 0x0000, "Sigmatel STAC9274D" }, + { HDA_CODEC_STAC9274X5NH, 0x0000, "Sigmatel STAC9274X5NH" }, + { HDA_CODEC_STAC9274D5NH, 0x0000, "Sigmatel STAC9274D5NH" }, + { HDA_CODEC_STAC9872AK, 0x0000, "Sigmatel STAC9872AK" }, + { HDA_CODEC_IDT92HD005, 0x0000, "IDT 92HD005" }, + { HDA_CODEC_IDT92HD005D, 0x0000, "IDT 92HD005D" }, + { HDA_CODEC_IDT92HD206X, 0x0000, "IDT 92HD206X" }, + { HDA_CODEC_IDT92HD206D, 0x0000, "IDT 92HD206D" }, + { HDA_CODEC_IDT92HD66B1X5, 0x0000, "IDT 92HD66B1X5" }, + { HDA_CODEC_IDT92HD66B2X5, 0x0000, "IDT 92HD66B2X5" }, + { HDA_CODEC_IDT92HD66B3X5, 0x0000, "IDT 92HD66B3X5" }, + { HDA_CODEC_IDT92HD66C1X5, 0x0000, "IDT 92HD66C1X5" }, + { HDA_CODEC_IDT92HD66C2X5, 0x0000, "IDT 92HD66C2X5" }, + { HDA_CODEC_IDT92HD66C3X5, 0x0000, "IDT 92HD66C3X5" }, + { HDA_CODEC_IDT92HD66B1X3, 0x0000, "IDT 92HD66B1X3" }, + { HDA_CODEC_IDT92HD66B2X3, 0x0000, "IDT 92HD66B2X3" }, + { HDA_CODEC_IDT92HD66B3X3, 0x0000, "IDT 92HD66B3X3" }, + { HDA_CODEC_IDT92HD66C1X3, 0x0000, "IDT 92HD66C1X3" }, + { HDA_CODEC_IDT92HD66C2X3, 0x0000, "IDT 92HD66C2X3" }, + { HDA_CODEC_IDT92HD66C3_65, 0x0000, "IDT 92HD66C3_65" }, + { HDA_CODEC_IDT92HD700X, 0x0000, "IDT 92HD700X" }, + { HDA_CODEC_IDT92HD700D, 0x0000, "IDT 92HD700D" }, + { HDA_CODEC_IDT92HD71B5, 0x0000, "IDT 92HD71B5" }, + { HDA_CODEC_IDT92HD71B5_2, 0x0000, "IDT 92HD71B5" }, + { HDA_CODEC_IDT92HD71B6, 0x0000, "IDT 92HD71B6" }, + { HDA_CODEC_IDT92HD71B6_2, 0x0000, "IDT 92HD71B6" }, + { HDA_CODEC_IDT92HD71B7, 0x0000, "IDT 92HD71B7" }, + { HDA_CODEC_IDT92HD71B7_2, 0x0000, "IDT 92HD71B7" }, + { HDA_CODEC_IDT92HD71B8, 0x0000, "IDT 92HD71B8" }, + { HDA_CODEC_IDT92HD71B8_2, 0x0000, "IDT 92HD71B8" }, + { HDA_CODEC_IDT92HD73C1, 0x0000, "IDT 92HD73C1" }, + { HDA_CODEC_IDT92HD73D1, 0x0000, "IDT 92HD73D1" }, + { HDA_CODEC_IDT92HD73E1, 0x0000, "IDT 92HD73E1" }, + { HDA_CODEC_IDT92HD75B3, 0x0000, "IDT 92HD75B3" }, + { HDA_CODEC_IDT92HD75BX, 0x0000, "IDT 92HD75BX" }, + { HDA_CODEC_IDT92HD81B1C, 0x0000, "IDT 92HD81B1C" }, + { HDA_CODEC_IDT92HD81B1X, 0x0000, "IDT 92HD81B1X" }, + { HDA_CODEC_IDT92HD83C1C, 0x0000, "IDT 92HD83C1C" }, + { HDA_CODEC_IDT92HD83C1X, 0x0000, "IDT 92HD83C1X" }, + { HDA_CODEC_IDT92HD87B1_3, 0x0000, "IDT 92HD87B1/3" }, + { HDA_CODEC_IDT92HD87B2_4, 0x0000, "IDT 92HD87B2/4" }, + { HDA_CODEC_IDT92HD89C3, 0x0000, "IDT 92HD89C3" }, + { HDA_CODEC_IDT92HD89C2, 0x0000, "IDT 92HD89C2" }, + { HDA_CODEC_IDT92HD89C1, 0x0000, "IDT 92HD89C1" }, + { HDA_CODEC_IDT92HD89B3, 0x0000, "IDT 92HD89B3" }, + { HDA_CODEC_IDT92HD89B2, 0x0000, "IDT 92HD89B2" }, + { HDA_CODEC_IDT92HD89B1, 0x0000, "IDT 92HD89B1" }, + { HDA_CODEC_IDT92HD89E3, 0x0000, "IDT 92HD89E3" }, + { HDA_CODEC_IDT92HD89E2, 0x0000, "IDT 92HD89E2" }, + { HDA_CODEC_IDT92HD89E1, 0x0000, "IDT 92HD89E1" }, + { HDA_CODEC_IDT92HD89D3, 0x0000, "IDT 92HD89D3" }, + { HDA_CODEC_IDT92HD89D2, 0x0000, "IDT 92HD89D2" }, + { HDA_CODEC_IDT92HD89D1, 0x0000, "IDT 92HD89D1" }, + { HDA_CODEC_IDT92HD89F3, 0x0000, "IDT 92HD89F3" }, + { HDA_CODEC_IDT92HD89F2, 0x0000, "IDT 92HD89F2" }, + { HDA_CODEC_IDT92HD89F1, 0x0000, "IDT 92HD89F1" }, + { HDA_CODEC_IDT92HD90BXX, 0x0000, "IDT 92HD90BXX" }, + { HDA_CODEC_IDT92HD91BXX, 0x0000, "IDT 92HD91BXX" }, + { HDA_CODEC_IDT92HD93BXX, 0x0000, "IDT 92HD93BXX" }, + { HDA_CODEC_IDT92HD98BXX, 0x0000, "IDT 92HD98BXX" }, + { HDA_CODEC_IDT92HD99BXX, 0x0000, "IDT 92HD99BXX" }, + { HDA_CODEC_CX20549, 0x0000, "Conexant CX20549 (Venice)" }, + { HDA_CODEC_CX20551, 0x0000, "Conexant CX20551 (Waikiki)" }, + { HDA_CODEC_CX20561, 0x0000, "Conexant CX20561 (Hermosa)" }, + { HDA_CODEC_CX20582, 0x0000, "Conexant CX20582 (Pebble)" }, + { HDA_CODEC_CX20583, 0x0000, "Conexant CX20583 (Pebble HSF)" }, + { HDA_CODEC_CX20584, 0x0000, "Conexant CX20584" }, + { HDA_CODEC_CX20585, 0x0000, "Conexant CX20585" }, + { HDA_CODEC_CX20588, 0x0000, "Conexant CX20588" }, + { HDA_CODEC_CX20590, 0x0000, "Conexant CX20590" }, + { HDA_CODEC_CX20631, 0x0000, "Conexant CX20631" }, + { HDA_CODEC_CX20632, 0x0000, "Conexant CX20632" }, + { HDA_CODEC_CX20641, 0x0000, "Conexant CX20641" }, + { HDA_CODEC_CX20642, 0x0000, "Conexant CX20642" }, + { HDA_CODEC_CX20651, 0x0000, "Conexant CX20651" }, + { HDA_CODEC_CX20652, 0x0000, "Conexant CX20652" }, + { HDA_CODEC_CX20664, 0x0000, "Conexant CX20664" }, + { HDA_CODEC_CX20665, 0x0000, "Conexant CX20665" }, + { HDA_CODEC_VT1708_8, 0x0000, "VIA VT1708_8" }, + { HDA_CODEC_VT1708_9, 0x0000, "VIA VT1708_9" }, + { HDA_CODEC_VT1708_A, 0x0000, "VIA VT1708_A" }, + { HDA_CODEC_VT1708_B, 0x0000, "VIA VT1708_B" }, + { HDA_CODEC_VT1709_0, 0x0000, "VIA VT1709_0" }, + { HDA_CODEC_VT1709_1, 0x0000, "VIA VT1709_1" }, + { HDA_CODEC_VT1709_2, 0x0000, "VIA VT1709_2" }, + { HDA_CODEC_VT1709_3, 0x0000, "VIA VT1709_3" }, + { HDA_CODEC_VT1709_4, 0x0000, "VIA VT1709_4" }, + { HDA_CODEC_VT1709_5, 0x0000, "VIA VT1709_5" }, + { HDA_CODEC_VT1709_6, 0x0000, "VIA VT1709_6" }, + { HDA_CODEC_VT1709_7, 0x0000, "VIA VT1709_7" }, + { HDA_CODEC_VT1708B_0, 0x0000, "VIA VT1708B_0" }, + { HDA_CODEC_VT1708B_1, 0x0000, "VIA VT1708B_1" }, + { HDA_CODEC_VT1708B_2, 0x0000, "VIA VT1708B_2" }, + { HDA_CODEC_VT1708B_3, 0x0000, "VIA VT1708B_3" }, + { HDA_CODEC_VT1708B_4, 0x0000, "VIA VT1708B_4" }, + { HDA_CODEC_VT1708B_5, 0x0000, "VIA VT1708B_5" }, + { HDA_CODEC_VT1708B_6, 0x0000, "VIA VT1708B_6" }, + { HDA_CODEC_VT1708B_7, 0x0000, "VIA VT1708B_7" }, + { HDA_CODEC_VT1708S_0, 0x0000, "VIA VT1708S_0" }, + { HDA_CODEC_VT1708S_1, 0x0000, "VIA VT1708S_1" }, + { HDA_CODEC_VT1708S_2, 0x0000, "VIA VT1708S_2" }, + { HDA_CODEC_VT1708S_3, 0x0000, "VIA VT1708S_3" }, + { HDA_CODEC_VT1708S_4, 0x0000, "VIA VT1708S_4" }, + { HDA_CODEC_VT1708S_5, 0x0000, "VIA VT1708S_5" }, + { HDA_CODEC_VT1708S_6, 0x0000, "VIA VT1708S_6" }, + { HDA_CODEC_VT1708S_7, 0x0000, "VIA VT1708S_7" }, + { HDA_CODEC_VT1702_0, 0x0000, "VIA VT1702_0" }, + { HDA_CODEC_VT1702_1, 0x0000, "VIA VT1702_1" }, + { HDA_CODEC_VT1702_2, 0x0000, "VIA VT1702_2" }, + { HDA_CODEC_VT1702_3, 0x0000, "VIA VT1702_3" }, + { HDA_CODEC_VT1702_4, 0x0000, "VIA VT1702_4" }, + { HDA_CODEC_VT1702_5, 0x0000, "VIA VT1702_5" }, + { HDA_CODEC_VT1702_6, 0x0000, "VIA VT1702_6" }, + { HDA_CODEC_VT1702_7, 0x0000, "VIA VT1702_7" }, + { HDA_CODEC_VT1716S_0, 0x0000, "VIA VT1716S_0" }, + { HDA_CODEC_VT1716S_1, 0x0000, "VIA VT1716S_1" }, + { HDA_CODEC_VT1718S_0, 0x0000, "VIA VT1718S_0" }, + { HDA_CODEC_VT1718S_1, 0x0000, "VIA VT1718S_1" }, + { HDA_CODEC_VT1802_0, 0x0000, "VIA VT1802_0" }, + { HDA_CODEC_VT1802_1, 0x0000, "VIA VT1802_1" }, + { HDA_CODEC_VT1812, 0x0000, "VIA VT1812" }, + { HDA_CODEC_VT1818S, 0x0000, "VIA VT1818S" }, + { HDA_CODEC_VT1828S, 0x0000, "VIA VT1828S" }, + { HDA_CODEC_VT2002P_0, 0x0000, "VIA VT2002P_0" }, + { HDA_CODEC_VT2002P_1, 0x0000, "VIA VT2002P_1" }, + { HDA_CODEC_VT2020, 0x0100, "VIA VT2020" }, + { HDA_CODEC_ATIRS600_1, 0x0000, "ATI RS600 HDMI" }, + { HDA_CODEC_ATIRS600_2, 0x0000, "ATI RS600 HDMI" }, + { HDA_CODEC_ATIRS690, 0x0000, "ATI RS690/780 HDMI" }, + { HDA_CODEC_ATIR6XX, 0x0000, "ATI R6xx HDMI" }, + { HDA_CODEC_NVIDIAMCP67, 0x0000, "NVidia MCP67 HDMI" }, + { HDA_CODEC_NVIDIAMCP73, 0x0000, "NVidia MCP73 HDMI" }, + { HDA_CODEC_NVIDIAMCP78, 0x0000, "NVidia MCP78 HDMI" }, + { HDA_CODEC_NVIDIAMCP78_2, 0x0000, "NVidia MCP78 HDMI" }, + { HDA_CODEC_NVIDIAMCP78_3, 0x0000, "NVidia MCP78 HDMI" }, + { HDA_CODEC_NVIDIAMCP78_4, 0x0000, "NVidia MCP78 HDMI" }, + { HDA_CODEC_NVIDIAMCP7A, 0x0000, "NVidia MCP7A HDMI" }, + { HDA_CODEC_NVIDIAGT220, 0x0000, "NVidia GT220 HDMI" }, + { HDA_CODEC_NVIDIAGT21X, 0x0000, "NVidia GT21x HDMI" }, + { HDA_CODEC_NVIDIAMCP89, 0x0000, "NVidia MCP89 HDMI" }, + { HDA_CODEC_NVIDIAGT240, 0x0000, "NVidia GT240 HDMI" }, + { HDA_CODEC_NVIDIAGTX470, 0x0000, "NVidia GTX470 HDMI" }, + { HDA_CODEC_NVIDIAGTS450, 0x0000, "NVidia GTS450 HDMI" }, + { HDA_CODEC_NVIDIAGT440, 0x0000, "NVidia GT440 HDMI" }, + { HDA_CODEC_NVIDIAGTX550, 0x0000, "NVidia GTX550 HDMI" }, + { HDA_CODEC_NVIDIAGTX570, 0x0000, "NVidia GTX570 HDMI" }, + { HDA_CODEC_NVIDIAGTX680, 0x0000, "NVidia GTX680 HDMI" }, + { HDA_CODEC_INTELIP, 0x0000, "Intel HD (Ironlake) HDMI" }, + { HDA_CODEC_INTELBL, 0x0000, "Intel 3100/X3500 (Bearlake) HDMI" }, + { HDA_CODEC_INTELCA, 0x0000, "Intel 4500MHD (Cantiga) HDMI" }, + { HDA_CODEC_INTELEL, 0x0000, "Intel (X)4500(HD) (Eaglelake) HDMI" }, + { HDA_CODEC_INTELIP2, 0x0000, "Intel HD (Ironlake) HDMI" }, + { HDA_CODEC_INTELCPT, 0x0000, "Intel HD 3000 (Sandy Bridge) HDMI" }, + { HDA_CODEC_INTELPPT, 0x0000, "Intel HD 4000 (Ivy Bridge) HDMI" }, + { HDA_CODEC_INTELCL, 0x0000, "Intel X3100 (Crestline) HDMI" }, + { HDA_CODEC_SII1390, 0x0000, "Silicon Image SiI1390 HDMI" }, + { HDA_CODEC_SII1392, 0x0000, "Silicon Image SiI1392 HDMI" }, + /* Unknown codec */ + { HDA_CODEC_ADXXXX, 0x0000, "Analog Devices (Unknown)" }, + { HDA_CODEC_AGEREXXXX, 0x0000, "Lucent/Agere Systems (Unknown)" }, + { HDA_CODEC_ALCXXXX, 0x0000, "Realtek (Unknown)" }, + { HDA_CODEC_ATIXXXX, 0x0000, "ATI (Unknown)" }, + { HDA_CODEC_CAXXXX, 0x0000, "Creative (Unknown)" }, + { HDA_CODEC_CMIXXXX, 0x0000, "CMedia (Unknown)" }, + { HDA_CODEC_CMIXXXX2, 0x0000, "CMedia (Unknown)" }, + { HDA_CODEC_CSXXXX, 0x0000, "Cirrus Logic (Unknown)" }, + { HDA_CODEC_CXXXXX, 0x0000, "Conexant (Unknown)" }, + { HDA_CODEC_CHXXXX, 0x0000, "Chrontel (Unknown)" }, + { HDA_CODEC_IDTXXXX, 0x0000, "IDT (Unknown)" }, + { HDA_CODEC_INTELXXXX, 0x0000, "Intel (Unknown)" }, + { HDA_CODEC_MOTOXXXX, 0x0000, "Motorola (Unknown)" }, + { HDA_CODEC_NVIDIAXXXX, 0x0000, "NVidia (Unknown)" }, + { HDA_CODEC_SIIXXXX, 0x0000, "Silicon Image (Unknown)" }, + { HDA_CODEC_STACXXXX, 0x0000, "Sigmatel (Unknown)" }, + { HDA_CODEC_VTXXXX, 0x0000, "VIA (Unknown)" }, + { 0, 0x0000, NULL } +}; + +#endif diff --git a/ComboJack_Source/Combo Jack/hda-verb.m b/ComboJack_Source/Combo Jack/hda-verb.m new file mode 100644 index 0000000..c3cfe58 --- /dev/null +++ b/ComboJack_Source/Combo Jack/hda-verb.m @@ -0,0 +1,1047 @@ +/* + * Accessing HD-audio verbs via hwdep interface + * Version 0.3 + * + * Copyright (c) 2008 Takashi Iwai + * + * Licensed under GPL v2 or later. + */ + +// +// Based on hda-verb from alsa-tools: +// https://www.alsa-project.org/main/index.php/Main_Page +// +// Conceptually derived from ALCPlugFix: +// https://github.com/goodwin/ALCPlugFix +// +// values come from https://github.com/torvalds/linux/blob/master/sound/pci/hda/patch_realtek.c + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PCI.h" +//#include "Tables.h" + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +// For driver +#include "hda_hwdep.h" +//#include "rt298.h" // From Linux +#define REALTEK_VENDOR_REGISTERS 0x20 +#define REALTEK_HP_OUT 0x21 + +#define AC_VERB_GET_STREAM_FORMAT 0x0a00 +#define AC_VERB_GET_AMP_GAIN_MUTE 0x0b00 +#define AC_VERB_GET_PROC_COEF 0x0c00 +#define AC_VERB_GET_COEF_INDEX 0x0d00 +#define AC_VERB_PARAMETERS 0x0f00 +#define AC_VERB_GET_CONNECT_SEL 0x0f01 +#define AC_VERB_GET_CONNECT_LIST 0x0f02 +#define AC_VERB_GET_PROC_STATE 0x0f03 +#define AC_VERB_GET_SDI_SELECT 0x0f04 +#define AC_VERB_GET_POWER_STATE 0x0f05 +#define AC_VERB_GET_CONV 0x0f06 +#define AC_VERB_GET_PIN_WIDGET_CONTROL 0x0f07 +#define AC_VERB_GET_UNSOLICITED_RESPONSE 0x0f08 +#define AC_VERB_GET_PIN_SENSE 0x0f09 +#define AC_VERB_GET_BEEP_CONTROL 0x0f0a +#define AC_VERB_GET_EAPD_BTLENABLE 0x0f0c +#define AC_VERB_GET_DIGI_CONVERT_1 0x0f0d +#define AC_VERB_GET_DIGI_CONVERT_2 0x0f0e +#define AC_VERB_GET_VOLUME_KNOB_CONTROL 0x0f0f +#define AC_VERB_GET_GPIO_DATA 0x0f15 +#define AC_VERB_GET_GPIO_MASK 0x0f16 +#define AC_VERB_GET_GPIO_DIRECTION 0x0f17 +#define AC_VERB_GET_GPIO_WAKE_MASK 0x0f18 +#define AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK 0x0f19 +#define AC_VERB_GET_GPIO_STICKY_MASK 0x0f1a +#define AC_VERB_GET_CONFIG_DEFAULT 0x0f1c +#define AC_VERB_GET_SUBSYSTEM_ID 0x0f20 + +#define AC_VERB_SET_STREAM_FORMAT 0x200 +#define AC_VERB_SET_AMP_GAIN_MUTE 0x300 +#define AC_VERB_SET_PROC_COEF 0x400 +#define AC_VERB_SET_COEF_INDEX 0x500 +#define AC_VERB_SET_CONNECT_SEL 0x701 +#define AC_VERB_SET_PROC_STATE 0x703 +#define AC_VERB_SET_SDI_SELECT 0x704 +#define AC_VERB_SET_POWER_STATE 0x705 +#define AC_VERB_SET_CHANNEL_STREAMID 0x706 +#define AC_VERB_SET_PIN_WIDGET_CONTROL 0x707 +#define AC_VERB_SET_UNSOLICITED_ENABLE 0x708 +#define AC_VERB_SET_PIN_SENSE 0x709 +#define AC_VERB_SET_BEEP_CONTROL 0x70a +#define AC_VERB_SET_EAPD_BTLENABLE 0x70c +#define AC_VERB_SET_DIGI_CONVERT_1 0x70d +#define AC_VERB_SET_DIGI_CONVERT_2 0x70e +#define AC_VERB_SET_VOLUME_KNOB_CONTROL 0x70f +#define AC_VERB_SET_GPIO_DATA 0x715 +#define AC_VERB_SET_GPIO_MASK 0x716 +#define AC_VERB_SET_GPIO_DIRECTION 0x717 +#define AC_VERB_SET_GPIO_WAKE_MASK 0x718 +#define AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK 0x719 +#define AC_VERB_SET_GPIO_STICKY_MASK 0x71a +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 0x71c +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_1 0x71d +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_2 0x71e +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_3 0x71f +#define AC_VERB_SET_CODEC_RESET 0x7ff + +#define AC_PAR_VENDOR_ID 0x00 +#define AC_PAR_SUBSYSTEM_ID 0x01 +#define AC_PAR_REV_ID 0x02 +#define AC_PAR_NODE_COUNT 0x04 +#define AC_PAR_FUNCTION_TYPE 0x05 +#define AC_PAR_AUDIO_FG_CAP 0x08 +#define AC_PAR_AUDIO_WIDGET_CAP 0x09 +#define AC_PAR_PCM 0x0a +#define AC_PAR_STREAM 0x0b +#define AC_PAR_PIN_CAP 0x0c +#define AC_PAR_AMP_IN_CAP 0x0d +#define AC_PAR_CONNLIST_LEN 0x0e +#define AC_PAR_POWER_STATE 0x0f +#define AC_PAR_PROC_CAP 0x10 +#define AC_PAR_GPIO_CAP 0x11 +#define AC_PAR_AMP_OUT_CAP 0x12 +#define AC_PAR_VOL_KNB_CAP 0x13 + +#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val) +#define WRITE_COEF(_idx, _val) WRITE_COEFEX(REALTEK_VENDOR_REGISTERS, _idx, _val) +#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(REALTEK_VENDOR_REGISTERS, _idx, _mask, _val) + +#define GETJACKSTATUS() VerbCommand(HDA_VERB(REALTEK_HP_OUT, AC_VERB_GET_PIN_SENSE, 0x00)) +#define VERBSTUB_SERVICE "com_XPS_VerbStub" +#define CODECCOMMANDER_SERVICE "CodecCommander" +#define GET_CFSTR_FROM_DICT(_dict, _key) (__bridge CFStringRef)[_dict objectForKey:_key] + +// +// Global Variables +// +CFURLRef iconUrl = NULL; +io_service_t VerbIOService; +io_connect_t DataConnection; +uint32_t connectiontype = 0; +bool run = true; +bool awake = false; +io_connect_t root_port; +io_object_t notifierObject; +struct stat consoleinfo; + +//get device id +//uint32_t vendor = 0; +//uint32_t device = 0; +long codecID = 0; +uint32_t subVendor = 0; +uint32_t subDevice = 0; +long codecIDArr[4] = {0x10ec0256, 0x10ec0255, 0x10ec0298, 0x10ec0295}; +int xps13SubDev[4] = {0x0704, 0x075b, 0x082a, 0x0923}; + +//dialog text +NSDictionary *l10nDict = nil; +NSDictionary *dlgText; + +// +// Open connection to IOService +// + +uint32_t OpenServiceConnection() +{ + // + // Having a kernel-side server (VerbStub) and a user-side client (hda-verb) is really the only way to ensure that hda- + // verb won't break when IOAudioFamily changes. This 2-component solution is necessary because we can't compile kernel + // libraries into user-space programs on macOS and expect them to work generically. + // + // Additionally, if this program were made as a single executable that accessed device memory regions directly, it would + // only be guaranteed to work for one machine on one BIOS version since memory regions change depending on hardware + // configurations. This is why Raspberry Pis, STM32s, and other embedded platforms are nice to program on: They don't + // change much between versions so programs can be made extremely lightweight. Linux also does a pretty good job + // achieving a similar situation, since everything (devices, buses, etc.) on Linux is represented by an easily + // accessible file (just look at how simple the hda-verb program in alsa-tools is! All it uses is ioctl). + // + + CFMutableDictionaryRef verbDict = IOServiceMatching(VERBSTUB_SERVICE); + CFMutableDictionaryRef codecCommanderDict = IOServiceMatching(CODECCOMMANDER_SERVICE); + + // Use IOServiceGetMatchingService since we can reasonably expect "VerbStub" is the only IORegistryEntry of its kind. + // Otherwise IOServiceGetMatchingServices with an iterating algorithm must be used to find the kernel extension. + + VerbIOService = IOServiceGetMatchingService(kIOMasterPortDefault, verbDict); + + // If VerbStub is not available, try CodecCommander + if (!VerbIOService) { + VerbIOService = IOServiceGetMatchingService(kIOMasterPortDefault, codecCommanderDict); + } + + // Hopefully the kernel extension loaded properly so it can be found. + if (!VerbIOService) + { + fprintf(stderr, "Could not locate VerbStub or CodecCommander kext. Ensure it is loaded; verbs cannot be sent otherwise.\n"); + return -1; + } + + // Connect to the IOService object + // Note: kern_return_t is just an int + kern_return_t kernel_return_status = IOServiceOpen(VerbIOService, mach_task_self(), connectiontype, &DataConnection); + + if (kernel_return_status != kIOReturnSuccess) + { + fprintf(stderr, "Failed to open VerbStub IOService: %08x.\n", kernel_return_status); + return -1; + } + + return kernel_return_status; // 0 if successful +} + +int indexOf(int *array, int array_size, int number) { + for (int i = 0; i < array_size; ++i) { + if (array[i] == number) { + return i; + } + } + return -1; +} + +int indexOf_L(long *array, int array_size, long number) { + for (int i = 0; i < array_size; ++i) { + if (array[i] == number) { + return i; + } + } + return -1; +} + +// +// Send verb command +// + +static uint32_t VerbCommand(uint32_t command) +{ + // + // Call the function ultimately responsible for sending commands in the kernel extension. That function will return the + // response we also want. + // https://lists.apple.com/archives/darwin-drivers/2008/Mar/msg00007.html + // + + uint32_t inputCount = 1; // Number of input arguments + uint32_t outputCount = 1; // Number of elements in output + uint64_t input = command; // Array of input scalars + uint64_t output; // Array of output scalars + + // IOConnectCallScalarMethod was introduced in Mac OS X 10.5 + + kern_return_t kernel_return_status = IOConnectCallScalarMethod(DataConnection, connectiontype, &input, inputCount, &output, &outputCount); + + if (kernel_return_status != kIOReturnSuccess) + { + fprintf(stderr, "Error sending command.\n"); + return -1; + } + + // Return command response + return (uint32_t)output; +} + +// +// Close connection to IOService +// + +void CloseServiceConnection() +{ + // Done with the VerbStub IOService object, so we don't need to hold on to it anymore + IOObjectRelease(VerbIOService); + IODeregisterForSystemPower(¬ifierObject); +} + +// +// UPDATE COEFFICIENTS +// + +static uint32_t UPDATE_COEFEX(uint32_t nid, uint32_t index, uint32_t mask, uint32_t value) +{ + struct hda_verb_ioctl SetCoefIndex; + struct hda_verb_ioctl GetProcCoef; + struct hda_verb_ioctl SetProcCoef; + + //int nid = REALTEK_VENDOR_REGISTERS; // Vendor Register 0x20 in rt298.h + uint32_t tmp; + + SetCoefIndex.verb = HDA_VERB(nid, AC_VERB_SET_COEF_INDEX, index); // Verb to set the coefficient index desired + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); // Go to index desired + if(SetCoefIndex.res != 0) // If uninitialized expect response of -1 (0xFFFFFFFF for uint32_t) + { + fprintf(stderr, "Received weird response 0x%x for command 0x%x\n", SetCoefIndex.res, SetCoefIndex.verb); + return -1; // Fail + } + + GetProcCoef.verb = HDA_VERB(nid, AC_VERB_GET_PROC_COEF, 0x00); // Get Processing Coefficient payload is always 0 + GetProcCoef.res = VerbCommand(GetProcCoef.verb); // Get original data + + tmp = GetProcCoef.res & ~mask; + tmp |= value & mask; + + if (tmp != GetProcCoef.res) + { + // New data to write! + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); // Reset back to the index desired (indices automatically iterate after a read) + + SetProcCoef.verb = HDA_VERB(nid, AC_VERB_SET_PROC_COEF, tmp); + SetProcCoef.res = VerbCommand(SetProcCoef.verb); // Send new processing coefficient + if (SetProcCoef.res != 0) + { + fprintf(stderr, "Received strange response 0x%x for command 0x%x\n", SetCoefIndex.res, SetCoefIndex.verb); + return -1; // Fail + } + } + // Return value just written (or not) as reported by register + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); // Go back to register + GetProcCoef.res = VerbCommand(GetProcCoef.verb); // Get register data + + // Return processing coefficient + return GetProcCoef.res; +} + +static uint32_t alc225_pre_hsmode(){ + UPDATE_COEF(0x4a, 1<<8, 0); + UPDATE_COEFEX(0x57, 0x05, 1<<14, 0); + UPDATE_COEF(0x63, 3<<14, 3<<14); + UPDATE_COEF(0x4a, 3<<4, 2<<4); + UPDATE_COEF(0x4a, 3<<10, 3<<10); + UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10); + UPDATE_COEF(0x4a, 3<<10, 0); + return 0; +} + +// +// Unplugged Settings +// + +static uint32_t unplugged() +{ + fprintf(stderr, "Jack Status: unplugged.\n"); + + switch (codecID) + { + case 0x10ec0255: + WRITE_COEF(0x1b, 0x0c0b); // LDO and MISC control + goto ALC255_256; + case 0x10ec0256: + WRITE_COEF(0x1b, 0x0c4b); // LDO and MISC control + ALC255_256: //common commands for alc255/256 + WRITE_COEF(0x45, 0xd089); /* UAJ function set to menual mode */ + UPDATE_COEFEX(0x57, 0x05, 1<<14, 0); /* Direct Drive HP Amp control(Set to verb control)*/ + WRITE_COEF(0x06, 0x6104); /* Set MIC2 Vref gate with HP */ + WRITE_COEFEX(0x57, 0x03, 0x8aa6); /* Direct Drive HP Amp control */ + //WRITE_COEF(0x46, 0xd089); + break; + case 0x10ec0295: + alc225_pre_hsmode(); + UPDATE_COEF(0x63, 3<<14, 0); + break; + case 0x10ec0298: + UPDATE_COEF(0x4f, 0xfcc0, 0xc400); + UPDATE_COEF(0x50, 0x2000, 0x2000); + UPDATE_COEF(0x56, 0x0006, 0x0006); + UPDATE_COEF(0x66, 0x0008, 0); + UPDATE_COEF(0x67, 0x2000, 0); + // Mac: Need to manually switch the selector back to internal microphone + VerbCommand(HDA_VERB(0x22, AC_VERB_SET_CONNECT_SEL, 0x05)); + break; + default: + break; + } + return 0; // Success +} + +// +// Headphones Settings +// + +static uint32_t headphones() +{ + fprintf(stderr, "Jack Status: headphones plugged in.\n"); + switch (codecID) + { + case 0x10ec0255: + case 0x10ec0256: + //VerbCommand(HDA_VERB(0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20)); + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20)); + WRITE_COEF(0x45, 0xc089); + WRITE_COEF(0x45, 0xc489); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + WRITE_COEF(0x49, 0x0049); + break; + case 0x10ec0295: + alc225_pre_hsmode(); + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20)); + UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10); + UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10); + UPDATE_COEF(0x49, 3<<8, 0<<8); + UPDATE_COEF(0x4a, 3<<4, 3<<4); + UPDATE_COEF(0x63, 3<<14, 0); + UPDATE_COEF(0x67, 0xf000, 0x3000); + break; + case 0x10ec0298: + UPDATE_COEF(0x4f, 0xfcc0, 0xc400); // Set to TRS type + VerbCommand(HDA_VERB(0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20)); // 0x20 corresponds to IN (0x20) + HiZ (0x00) -- Note: HiZ means "High Impedance" + UPDATE_COEF(0x50, 0x2000, 0x2000); + UPDATE_COEF(0x56, 0x0006, 0x0006); + UPDATE_COEF(0x66, 0x0008, 0); + UPDATE_COEF(0x67, 0x2000, 0); + break; + default: + break; + } + return 0; // Success +} + +// +// Line-In Settings +// + +static uint32_t linein() +{ + fprintf(stderr, "Jack Status: line-in device plugged in.\n"); + + //alc_headset_mode_mic_in + switch (codecID) + { + case 0x10ec0255: + case 0x10ec0256: + return headphones(); //line-in does not work + //VerbCommand(HDA_VERB(0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0)); // Disable headphone output + //WRITE_COEFEX(0x57, 0x03, 0x8aa6); + //WRITE_COEF(0x06, 0x6100); + break; + case 0x10ec0295: + alc225_pre_hsmode(); + UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10); + VerbCommand(HDA_VERB(0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0)); + WRITE_COEFEX(0x57, 0x03, 0x8aa6); + WRITE_COEF(0x06, 0x6100); /* Set MIC2 Vref gate to normal */ + break; + case 0x10ec0298: + UPDATE_COEF(0x4f, 0x000c, 0x0); + //set 0x21 pin_w 0 here + VerbCommand(HDA_VERB(0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0)); // Disable headphone output + UPDATE_COEF(0x50, 0x2000, 0); + UPDATE_COEF(0x56, 0x0006, 0); + UPDATE_COEF(0x4f, 0xfcc0, 0xc400); //Set to TRS type + UPDATE_COEF(0x66, 0x0008, 0x0008); + UPDATE_COEF(0x67, 0x2000, 0x2000); + break; + default: + break; + } + + //set 0x1a pin_w 0x21 here + // 0x21 corresponds to IN (0x20) + VREF 50 (0x01) + VerbCommand(HDA_VERB(0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x21)); + // Mac: Check power state of node 0x1a since it's frequently in D3 + if (VerbCommand(HDA_VERB(0x1a, AC_VERB_GET_POWER_STATE, 0x00)) != 0) + { + // Mac: Power on node 0x1a if in D3 + VerbCommand(HDA_VERB(0x1a, AC_VERB_SET_POWER_STATE, 0x00)); + } + // Mac: Need to manually switch the selector to line-in node + VerbCommand(HDA_VERB(0x22, AC_VERB_SET_CONNECT_SEL, 0x02)); + + return 0; // Success +} + + +// +// Headset: CTIA (iPhone-style plug) +// + +static uint32_t headsetCTIA() +{ + fprintf(stderr, "Jack Status: headset (CTIA/iPhone) plugged in.\n"); + + //alc_headset_mode_ctia + switch (codecID) + { + case 0x10ec0255: + WRITE_COEF(0x45, 0xd489); //Set to CTIA type + WRITE_COEF(0x1b, 0x0c2b); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + break; + case 0x10ec0256: + WRITE_COEF(0x45, 0xd489); //Set to CTIA type + WRITE_COEF(0x1b, 0x0c6b); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + break; + case 0x10ec0295: + UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10); + UPDATE_COEF(0x63, 3<<14, 1<<14); + break; + case 0x10ec0298: + UPDATE_COEF(0x8e, 0x0070, 0x0020); // Headset output enable + UPDATE_COEF(0x4f, 0xfcc0, 0xd400); + usleep(300000); + UPDATE_COEF(0x50, 0x2000, 0x2000); + UPDATE_COEF(0x56, 0x0006, 0x0006); + UPDATE_COEF(0x66, 0x0008, 0); + UPDATE_COEF(0x67, 0x2000, 0); + // Mac: Need to manually switch the selector to headset node + VerbCommand(HDA_VERB(0x22, AC_VERB_SET_CONNECT_SEL, 0x00)); + break; + default: + break; + } + + return 0; // Success +} + +// +// Headset: OMTP (Nokia-style plug) +// + +static uint32_t headsetOMTP() +{ + fprintf(stderr, "Jack Status: headset (OMTP/Nokia) plugged in.\n"); + /* + //alc288 + UPDATE_COEF(0x4f, 0xfcc0, 0xe400); + usleep(300000); + UPDATE_COEF(0x50, 0x2000, 0x2000); + UPDATE_COEF(0x56, 0x0006, 0x0006); + UPDATE_COEF(0x66, 0x0008, 0); + UPDATE_COEF(0x67, 0x2000, 0); + */ + //alc256 + switch (codecID) + { + case 0x10ec0255: + WRITE_COEF(0x45, 0xe489); + WRITE_COEF(0x1b, 0x0c2b); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + break; + case 0x10ec0256: + WRITE_COEF(0x45, 0xe489); + WRITE_COEF(0x1b, 0x0c6b); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + break; + case 0x10ec0295: + WRITE_COEF(0x45, 0xe489); /* Set to OMTP Type */ + WRITE_COEF(0x1b, 0x0c2b); + WRITE_COEFEX(0x57, 0x03, 0x8ea6); + break; + case 0x10ec0298: + UPDATE_COEF(0x4f, 0xfcc0, 0xe400); + usleep(300000); + UPDATE_COEF(0x50, 0x2000, 0x2000); + UPDATE_COEF(0x56, 0x0006, 0x0006); + UPDATE_COEF(0x66, 0x0008, 0); + UPDATE_COEF(0x67, 0x2000, 0); + // Mac: Need to manually switch the selector to headset node + VerbCommand(HDA_VERB(0x22, AC_VERB_SET_CONNECT_SEL, 0x00)); + break; + default: + break; + } + + return 0; // Success +} + +// +// Headset Auto-Detection (CTIA/OMTP) +// + +static uint32_t headsetcheck() +{ + struct hda_verb_ioctl SetCoefIndex; + struct hda_verb_ioctl GetProcCoef; + uint32_t retval; + + int nid = REALTEK_VENDOR_REGISTERS; +// bool is_ctia; + + fprintf(stderr, "Jack Status: headset plugged in. Checking type...\n"); + + switch (codecID) + { + case 0x10ec0255: + case 0x10ec0256: + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24)); // 0x24 corresponds to IN (0x20) + VREF 80 (0x04) + WRITE_COEF(0x45, 0xd089); + WRITE_COEF(0x49, 0x0149); + usleep(350000); + // Read register 0x46 + SetCoefIndex.verb = HDA_VERB(nid, AC_VERB_SET_COEF_INDEX, 0x46); + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); + GetProcCoef.verb = HDA_VERB(nid, AC_VERB_GET_PROC_COEF, 0x46); + GetProcCoef.res = VerbCommand(GetProcCoef.verb); + break; + case 0x10ec0295: + alc225_pre_hsmode(); + UPDATE_COEF(0x67, 0xf000, 0x1000); //Headset output enable + UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10); //Headset output enable + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24)); // 0x24 corresponds to IN (0x20) + VREF 80 (0x04) + UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10); //Check Type + UPDATE_COEF(0x49, 3<<8, 2<<8); //Check Type + usleep(350000); + // Read register 0x50 + SetCoefIndex.verb = HDA_VERB(nid, AC_VERB_SET_COEF_INDEX, 0x46); // Verb to set the coefficient index desired + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); // Go to index desired + GetProcCoef.verb = HDA_VERB(nid, AC_VERB_GET_PROC_COEF, 0x00); // Get Processing Coefficient payload is always 0 + GetProcCoef.res = VerbCommand(GetProcCoef.verb); // Get data + break; + case 0x10ec0298: + UPDATE_COEF(0x8e, 0x0070, 0x0020); //Headset output enable + VerbCommand(HDA_VERB(0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24)); // 0x24 corresponds to IN (0x20) + VREF 80 (0x04) + UPDATE_COEF(0x4f, 0xfcc0, 0xd400); //Check Type + usleep(350000); + // Read register 0x50 + SetCoefIndex.verb = HDA_VERB(nid, AC_VERB_SET_COEF_INDEX, 0x50); // Verb to set the coefficient index desired + SetCoefIndex.res = VerbCommand(SetCoefIndex.verb); // Go to index desired + GetProcCoef.verb = HDA_VERB(nid, AC_VERB_GET_PROC_COEF, 0x00); // Get Processing Coefficient payload is always 0 + GetProcCoef.res = VerbCommand(GetProcCoef.verb); // Get data + break; + default: + break; + } + + // Check if register 0x50 reports a CTIA- or OMTP-style headset + fprintf(stderr, "Headset check: 0x%x, 0x%x\n", GetProcCoef.res, GetProcCoef.res & 0x0070); + if ((GetProcCoef.res & 0x0070) == 0x0070) + { + retval = headsetCTIA(); + } + else + { + retval = headsetOMTP(); + } + + WRITE_COEF(0x06, 0x6104); +// is_ctia = (GetProcCoef.res & 0x0070) == 0x0070; <-- Wow. + + return retval; // Success +} + +// +// Jack unplug monitor +// + +void JackBehavior() +{ + int counter = 4; + + while (run) // Poll headphone jack state + { + usleep(250*1000); // Polling frequency (seconds): use usleep for microseconds if finer-grained control is needed + if (awake) + { + awake = false; + break; + } + + if ((GETJACKSTATUS() & 0x80000000) != 0x80000000) + { + if (--counter < 0) + break; + } + else + counter = 4; + } + if (run) // If process is killed, maintain current state + { + fprintf(stderr, "Unplugged.\n"); + unplugged(); // Clean up, jack's been unplugged or process was killed + } +} + +// +// Pop-up menu +// + +uint32_t CFPopUpMenu() +{ + CFOptionFlags responsecode = kCFUserNotificationOtherResponse; + +// while (true) +// { +// //wait until user logged in +// stat("/dev/console", &consoleinfo); +// if (!consoleinfo.st_uid) +// { +// sleep(1); +// continue; +// } +// else if ((GETJACKSTATUS() & 0x80000000) != 0x80000000) +// return unplugged(); +// +// if (awake) awake = false; +// //get current locale settings +// NSString *locale = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleLocale"]; +// //load localized strings +// NSDictionary* CurDict = [l10nDict objectForKey:locale]; +// NSMutableDictionary* Merged = dlgText.mutableCopy; +// [Merged addEntriesFromDictionary: CurDict]; +// //display dialog +// CFUserNotificationDisplayAlert( +// 0, // CFTimeInterval timeout +// kCFUserNotificationNoteAlertLevel, // CFOptionFlags flags +// iconUrl, // CFURLRef iconURL (file location URL) +// NULL, // CFURLRef soundURL (unused) +// NULL, // CFURLRef localizationURL +// GET_CFSTR_FROM_DICT(Merged, @"dialogTitle"), //CFStringRef alertHeader +// GET_CFSTR_FROM_DICT(Merged, @"dialogMsg"), //CFStringRef alertMessage +// GET_CFSTR_FROM_DICT(Merged, @"btnHeadphone"), //CFStringRef defaultButtonTitle +// NULL, // GET_CFSTR_FROM_DICT(Merged, @"btnLinein"), //CFStringRef alternateButtonTitle +// //GET_CFSTR_FROM_DICT(Merged, @"btnCancel"), //CFStringRef alternateButtonTitle +// GET_CFSTR_FROM_DICT(Merged, @"btnHeadset"), //CFStringRef otherButtonTitle +// &responsecode // CFOptionFlags *responseFlags +// ); +// break; +// } + + if ((GETJACKSTATUS() & 0x80000000) != 0x80000000) + return unplugged(); + + /* Responses are of this format: + kCFUserNotificationDefaultResponse = 0, + kCFUserNotificationAlternateResponse = 1, + kCFUserNotificationOtherResponse = 2, + kCFUserNotificationCancelResponse = 3 + */ + + switch (responsecode) + { + case kCFUserNotificationDefaultResponse: + fprintf(stderr, "Headphones selected.\n"); + return headphones(); + break; + case kCFUserNotificationAlternateResponse: + fprintf(stderr, "Line-In selected.\n"); + return linein(); + //Cancel + //fprintf(stderr, "Cancelled.\n"); + //return 0; // Maintain current state + break; + case kCFUserNotificationOtherResponse: + fprintf(stderr, "Headset selected.\n"); + return headsetcheck(); + break; + default: + fprintf(stderr, "Cancelled.\n"); + // return unplugged(); // This was originally meant to reset the jack state to "unplugged," but "maintaining current state" is more intuitive + return 0; // Maintain current state + break; + } + + return 0; +} + +// +// Respect OS signals +// + +void sigHandler(int signo) +{ + fprintf(stderr, "\nsigHandler: Received signal %d\n", signo); // Technically this print is not async-safe, but so far haven't run into any issues + switch (signo) + { + // Need to be sure object gets released correctly on any kind of quit + // notification, otherwise the program's left still running! + case SIGINT: // CTRL + c or Break key + case SIGTERM: // Shutdown/Restart + case SIGHUP: // "Hang up" (legacy) + case SIGKILL: // Kill + case SIGTSTP: // Close terminal from x button + run = false; + break; // SIGTERM, SIGINT mean we must quit, so do it gracefully + default: + break; + } +} + +//Codec fixup, invoked when boot/wake +void alcInit() +{ + fprintf(stderr, "Init codec.\n"); + switch (codecID) + { + case 0x10ec0256: + if (indexOf(xps13SubDev, 4, subDevice) == -1 || subVendor != 0x1028) + goto ALC255_COMMON; + fprintf(stderr, "Fix XPS 13.\n"); + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x25)); + VerbCommand(HDA_VERB(0x21, AC_VERB_SET_UNSOLICITED_ENABLE, 0x83)); + //ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE + VerbCommand(HDA_VERB(0x20, AC_VERB_SET_COEF_INDEX, 0x36)); + VerbCommand(HDA_VERB(0x20, AC_VERB_SET_PROC_COEF, 0x1737)); + //ALC255_FIXUP_DELL1_MIC_NO_PRESENCE -> ALC255_FIXUP_HEADSET_MODE -> alc255_set_default_jack_type + WRITE_COEF(0x1b, 0x884b); + WRITE_COEF(0x45, 0xd089); + WRITE_COEF(0x1b, 0x084b); + WRITE_COEF(0x46, 0x0004); + WRITE_COEF(0x1b, 0x0c4b); + break; + case 0x10ec0295: + WRITE_COEFEX(0x4a, 0x8000, 1 << 15); + WRITE_COEFEX(0x4a, 0x8000, 0 << 15); + goto ALC255_COMMON; + case 0x10ec0255: + ALC255_COMMON: + VerbCommand(HDA_VERB(0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24)); + VerbCommand(HDA_VERB(0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20)); + VerbCommand(HDA_VERB(0x21, AC_VERB_SET_UNSOLICITED_ENABLE, 0x83)); + break; + case 0x10ec0298: + VerbCommand(HDA_VERB(0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x22)); + VerbCommand(HDA_VERB(0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x23)); + VerbCommand(HDA_VERB(0x21, AC_VERB_SET_UNSOLICITED_ENABLE, 0x83)); + break; + default: + break; + } +} + +// Sleep/Wake event callback function, calls the fixup function +void SleepWakeCallBack( void * refCon, io_service_t service, natural_t messageType, void * messageArgument ) +{ + switch ( messageType ) + { + case kIOMessageCanSystemSleep: + IOAllowPowerChange( root_port, (long)messageArgument ); + break; + case kIOMessageSystemWillSleep: + IOAllowPowerChange( root_port, (long)messageArgument ); + break; + case kIOMessageSystemWillPowerOn: + break; + case kIOMessageSystemHasPoweredOn: + while(run) + { + if (GETJACKSTATUS() != -1) + break; + usleep(250000); + } + printf( "Re-init codec...\n" ); + alcInit(); + awake = true; + break; + default: + break; + } +} + +// start cfrunloop that listen to wakeup event +void watcher(void) +{ + IONotificationPortRef notifyPortRef; + void* refCon = NULL; + root_port = IORegisterForSystemPower( refCon, ¬ifyPortRef, SleepWakeCallBack, ¬ifierObject ); + if ( root_port == 0 ) + { + printf("IORegisterForSystemPower failed\n"); + exit(1); + } + else + { + CFRunLoopAddSource( CFRunLoopGetCurrent(), + IONotificationPortGetRunLoopSource(notifyPortRef), kCFRunLoopCommonModes ); + printf("Starting wakeup watcher\n"); + CFRunLoopRun(); + } +} + + +//Get onboard audio device info, adapted from DPCIManager +void getAudioID() +{ + codecID = 0, subVendor = 0, subDevice = 0; + io_service_t HDACodecFuncIOService; + io_service_t HDACodecDrvIOService; + io_service_t HDACodecDevIOService; + io_service_t HDACtrlIOService; + io_service_t pciDevIOService; + IORegistryEntryGetParentEntry(VerbIOService, kIOServicePlane, &HDACodecFuncIOService); //IOHDACodecFunction + IORegistryEntryGetParentEntry(HDACodecFuncIOService, kIOServicePlane, &HDACodecDrvIOService); //IOHDACodecDriver + IORegistryEntryGetParentEntry(HDACodecDrvIOService, kIOServicePlane, &HDACodecDevIOService); //IOHDACodecDevice + IORegistryEntryGetParentEntry(HDACodecDevIOService, kIOServicePlane, &HDACtrlIOService);//AppleHDAController + IORegistryEntryGetParentEntry(HDACtrlIOService, kIOServicePlane, &pciDevIOService);//HDEF + pciDevice *audio = [pciDevice create:pciDevIOService]; + codecID = [[pciDevice grabNumber:CFSTR("IOHDACodecVendorID") forService:HDACodecDevIOService] longValue] & 0xFFFFFFFF; + subVendor = audio.subVendor.intValue; + subDevice = audio.subDevice.intValue; + fprintf(stderr, "CodecID: 0x%lx\n", codecID); + fprintf(stderr, "subVendor: 0x%x\n", subVendor); + fprintf(stderr, "subDevice: 0x%x\n", subDevice); + IOObjectRelease(HDACodecFuncIOService); + IOObjectRelease(HDACodecDrvIOService); + IOObjectRelease(HDACodecDevIOService); + IOObjectRelease(HDACtrlIOService); + IOObjectRelease(pciDevIOService); + //[audio release]; +} + +// +// Main +// + +int main() +{ + fprintf(stderr, "Starting jack watcher.\n"); + //Allow only one instance + if (sem_open("XPS_ComboJack_Watcher", O_CREAT, 600, 1) == SEM_FAILED) + { + fprintf(stderr, "Another instance is already running!\n"); + return 1; + } + // Set up error handler + signal(SIGHUP, sigHandler); + signal(SIGTERM, sigHandler); + signal(SIGINT, sigHandler); + signal(SIGKILL, sigHandler); + signal(SIGTSTP, sigHandler); + + // Local variables + kern_return_t ServiceConnectionStatus; + int version; + //int nid, verb, param; + u32 jackstat; + //struct hda_verb_ioctl val; + + // Mac version of hda-verb + version = 0x2710; // Darwin + + // If this error appears, the program was compiled incorrectly + if (version < HDA_HWDEP_VERSION) { + fprintf(stderr, "Invalid version number 0x%x\n", version); + return 1; + } + + // Establish user-kernel connection + ServiceConnectionStatus = OpenServiceConnection(); + if (ServiceConnectionStatus != kIOReturnSuccess) + { + while ((ServiceConnectionStatus != kIOReturnSuccess) && run) + { + fprintf(stderr, "Error establshing IOService connection. Retrying in 1 second...\n"); + sleep (1); + ServiceConnectionStatus = OpenServiceConnection(); + } + } + + // Get audio device info, exit if no compatible device found + getAudioID(); + //long codecIDArr[3] = {0x10ec0256, 0x10ec0255, 0x10ec0298}; + if (indexOf_L(codecIDArr, 4, codecID) == -1 || ! subVendor || !subDevice) + { + fprintf(stderr, "No compatible audio device found! Exit now.\n"); + return 1; + } + + //alc256 init + alcInit(); + //start a new thread that waits for wakeup event + pthread_t watcher_id; + if (pthread_create(&watcher_id,NULL,(void*)watcher,NULL)) + { + fprintf(stderr, "create pthread error!\n"); + return 1; + } + + //load ui resources + iconUrl = CFURLCreateWithString(NULL, CFSTR("file:///usr/local/share/ComboJack/Headphone.icns"), NULL); + if (!CFURLResourceIsReachable(iconUrl, NULL)) + iconUrl = NULL; + //NSData *l10nData = [NSData dataWithContentsOfFile:@"/usr/local/share/ComboJack/l10n.json"]; + /* + if(NSClassFromString(@"NSJSONSerialization")) + { + NSError *error = nil; + id l10nObj = [NSJSONSerialization + JSONObjectWithData:[NSData dataWithContentsOfFile:@"/usr/local/share/ComboJack/l10n.json"] + options:0 error:&error]; + if(!error && [l10nObj isKindOfClass:[NSDictionary class]]) + l10nDict = l10nObj; + } + */ + dlgText = [[NSDictionary alloc] initWithObjectsAndKeys: + @"Combo Jack Notification", @"dialogTitle", + @"What did you just plug in? (Press ESC to cancel)", @"dialogMsg", + @"Headphones", @"btnHeadphone", + @"Line-In", @"btnLinein", + @"Headset", @"btnHeadset", + @"Cancel", @"btnCancel", + nil]; + + // Set up jack monitor verb command + //nid = REALTEK_HP_OUT; + //verb = AC_VERB_GET_PIN_SENSE; + //param = 0x00; + + //fprintf(stderr, "nid = 0x%x, verb = 0x%x, param = 0x%x\n", nid, verb, param); + +// fprintf(stderr, "TEST Update Coef Command = 0x%x\n", UPDATE_COEF(0x4f, 0xfcc0, 0xd400)); + + // Properly format jack monitor verb command + //val.verb = HDA_VERB(nid, verb, param); + + // This is just a test send +// fprintf(stderr, "Verb Command = 0x%x\n", val.verb); +// val.res = VerbCommand(val.verb); +// fprintf(stderr, "Response = 0x%x\n", val.res); + int counter = 4; + + while (run) // Poll headphone jack state + { + jackstat = GETJACKSTATUS(); + if (jackstat == -1) // 0xFFFFFFFF means jack not ready yet + { + fprintf(stderr, "Jack not ready. Checking again in 1 second...\n"); + counter = 4; + } + else if ((jackstat & 0x80000000) == 0x80000000) + { + if (--counter < 0) + { + counter = 4; + fprintf(stderr, "Jack sense detected! Displaying menu...\n"); + if (CFPopUpMenu() == 0) + { + JackBehavior(); + } + else + { + break; + } + } + } + else + counter = 4; + + //if (awake) awake = false; + usleep(250*1000); // Sleep delay (seconds): use usleep for microseconds if fine-grained control is needed + } + + // All done here, clean up and exit safely + CloseServiceConnection(); + /* + IODeregisterForSystemPower(¬ifier); + IOServiceClose(rootPort); + IONotificationPortDestroy(notificationPort); + */ + fprintf(stderr, "Exiting safely!\n"); + + return 0; +} diff --git a/ComboJack_Source/Combo Jack/hda_hwdep.h b/ComboJack_Source/Combo Jack/hda_hwdep.h new file mode 100644 index 0000000..bb753f3 --- /dev/null +++ b/ComboJack_Source/Combo Jack/hda_hwdep.h @@ -0,0 +1,42 @@ +/* + * HWDEP Interface for HD-audio codec + * + * Copyright (c) 2007 Takashi Iwai + * + * This driver is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This driver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// +// Adapted from hda-verb from alsa-tools: +// https://www.alsa-project.org/main/index.php/Main_Page +// + +#ifndef __SOUND_HDA_HWDEP_H +#define __SOUND_HDA_HWDEP_H + +#define HDA_HWDEP_VERSION 0x2710 /* Darwin */ + +/* verb */ +#define HDA_REG_NID_SHIFT 20 +#define HDA_REG_VERB_SHIFT 8 +#define HDA_REG_VAL_SHIFT 0 +#define HDA_VERB(nid,verb,param) ((nid)<<20 | (verb)<<8 | (param)) + +struct hda_verb_ioctl { + u32 verb; /* HDA_VERB() */ + u32 res; /* response */ +}; + +#endif diff --git a/ComboJack_Source/Combo Jack/rt298.h b/ComboJack_Source/Combo Jack/rt298.h new file mode 100644 index 0000000..c4ce89c --- /dev/null +++ b/ComboJack_Source/Combo Jack/rt298.h @@ -0,0 +1,219 @@ +/* + * rt298.h -- RT298 ALSA SoC audio driver + * + * Copyright 2011 Realtek Microelectronics + * Author: Johnny Hsu + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +// +// Very lightly adapted from the Linux kernel: +// https://github.com/torvalds/linux +// + +#ifndef __RT298_H__ +#define __RT298_H__ + +#define VERB_CMD(V, N, D) ((N << 20) | (V << 8) | D) + +#define RT298_AUDIO_FUNCTION_GROUP 0x01 +#define RT298_DAC_OUT1 0x02 +#define RT298_DAC_OUT2 0x03 +#define RT298_DIG_CVT 0x06 +#define RT298_ADC_IN1 0x09 +#define RT298_ADC_IN2 0x08 +#define RT298_MIXER_IN 0x0b +#define RT298_MIXER_OUT1 0x0c +#define RT298_MIXER_OUT2 0x0d +#define RT298_DMIC1 0x12 +#define RT298_DMIC2 0x13 +#define RT298_SPK_OUT 0x14 // 0x17 for ALC3266 +#define RT298_MIC1 0x18 +#define RT298_LINE1 0x1a +#define RT298_BEEP 0x1d +#define RT298_SPDIF 0x1e +#define RT298_VENDOR_REGISTERS 0x20 +#define RT298_HP_OUT 0x21 +#define RT298_MIXER_IN1 0x22 +#define RT298_MIXER_IN2 0x23 +#define RT298_INLINE_CMD 0x55 + +#define RT298_SET_PIN_SFT 6 +#define RT298_SET_PIN_ENABLE 0x40 +#define RT298_SET_PIN_DISABLE 0 +#define RT298_SET_EAPD_HIGH 0x2 +#define RT298_SET_EAPD_LOW 0 + +#define RT298_MUTE_SFT 7 + +/* Verb commands */ +#define RT298_GET_PARAM(NID, PARAM) VERB_CMD(AC_VERB_PARAMETERS, NID, PARAM) +#define RT298_SET_POWER(NID) VERB_CMD(AC_VERB_SET_POWER_STATE, NID, 0) +#define RT298_SET_AUDIO_POWER RT298_SET_POWER(RT298_AUDIO_FUNCTION_GROUP) +#define RT298_SET_HPO_POWER RT298_SET_POWER(RT298_HP_OUT) +#define RT298_SET_SPK_POWER RT298_SET_POWER(RT298_SPK_OUT) +#define RT298_SET_DMIC1_POWER RT298_SET_POWER(RT298_DMIC1) +#define RT298_SPK_MUX\ + VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT298_SPK_OUT, 0) +#define RT298_HPO_MUX\ + VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT298_HP_OUT, 0) +#define RT298_ADC0_MUX\ + VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT298_MIXER_IN1, 0) +#define RT298_ADC1_MUX\ + VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT298_MIXER_IN2, 0) +#define RT298_SET_MIC1\ + VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT298_MIC1, 0) +#define RT298_SET_PIN_HPO\ + VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT298_HP_OUT, 0) +#define RT298_SET_PIN_SPK\ + VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT298_SPK_OUT, 0) +#define RT298_SET_PIN_DMIC1\ + VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT298_DMIC1, 0) +#define RT298_SET_PIN_SPDIF\ + VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT298_SPDIF, 0) +#define RT298_SET_PIN_DIG_CVT\ + VERB_CMD(AC_VERB_SET_DIGI_CONVERT_1, RT298_DIG_CVT, 0) +#define RT298_SPK_EAPD\ + VERB_CMD(AC_VERB_SET_EAPD_BTLENABLE, RT298_SPK_OUT, 0) +#define RT298_SET_AMP_GAIN_HPO\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_HP_OUT, 0) +#define RT298_SET_AMP_GAIN_ADC_IN1\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_ADC_IN1, 0) +#define RT298_SET_AMP_GAIN_ADC_IN2\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_ADC_IN2, 0) +#define RT298_GET_HP_SENSE\ + VERB_CMD(AC_VERB_GET_PIN_SENSE, RT298_HP_OUT, 0) +#define RT298_GET_MIC1_SENSE\ + VERB_CMD(AC_VERB_GET_PIN_SENSE, RT298_MIC1, 0) +#define RT298_SET_DMIC2_DEFAULT\ + VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT298_DMIC2, 0) +#define RT298_SET_SPDIF_DEFAULT\ + VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT298_SPDIF, 0) +#define RT298_DACL_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_DAC_OUT1, 0xa000) +#define RT298_DACR_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_DAC_OUT1, 0x9000) +#define RT298_ADCL_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_ADC_IN1, 0x6000) +#define RT298_ADCR_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_ADC_IN1, 0x5000) +#define RT298_MIC_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIC1, 0x7000) +#define RT298_SPOL_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_SPK_OUT, 0xa000) +#define RT298_SPOR_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_SPK_OUT, 0x9000) +#define RT298_HPOL_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_HP_OUT, 0xa000) +#define RT298_HPOR_GAIN\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_HP_OUT, 0x9000) +#define RT298_F_DAC_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_OUT1, 0x7000) +#define RT298_F_RECMIX_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_OUT1, 0x7100) +#define RT298_REC_MIC_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_IN, 0x7000) +#define RT298_REC_I2S_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_IN, 0x7100) +#define RT298_REC_LINE_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_IN, 0x7200) +#define RT298_REC_BEEP_SWITCH\ + VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT298_MIXER_IN, 0x7300) +#define RT298_DAC_FORMAT\ + VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT298_DAC_OUT1, 0) +#define RT298_ADC_FORMAT\ + VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT298_ADC_IN1, 0) +#define RT298_COEF_INDEX\ + VERB_CMD(AC_VERB_SET_COEF_INDEX, RT298_VENDOR_REGISTERS, 0) +#define RT298_PROC_COEF\ + VERB_CMD(AC_VERB_SET_PROC_COEF, RT298_VENDOR_REGISTERS, 0) +#define RT298_UNSOLICITED_INLINE_CMD\ + VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT298_INLINE_CMD, 0) +#define RT298_UNSOLICITED_HP_OUT\ + VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT298_HP_OUT, 0) +#define RT298_UNSOLICITED_MIC1\ + VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT298_MIC1, 0) + +/* Index registers */ +#define RT298_A_BIAS_CTRL1 0x01 +#define RT298_A_BIAS_CTRL2 0x02 +#define RT298_POWER_CTRL1 0x03 +#define RT298_A_BIAS_CTRL3 0x04 +#define RT298_D_FILTER_CTRL 0x05 +#define RT298_POWER_CTRL2 0x08 +#define RT298_I2S_CTRL1 0x09 +#define RT298_I2S_CTRL2 0x0a +#define RT298_CLK_DIV 0x0b +#define RT298_DC_GAIN 0x0d +#define RT298_POWER_CTRL3 0x0f +#define RT298_MIC1_DET_CTRL 0x19 +#define RT298_MISC_CTRL1 0x20 +#define RT298_IRQ_CTRL 0x33 +#define RT298_WIND_FILTER_CTRL 0x46 +#define RT298_PLL_CTRL1 0x49 +#define RT298_VAD_CTRL 0x4e +#define RT298_CBJ_CTRL1 0x4f +#define RT298_CBJ_CTRL2 0x50 +#define RT298_PLL_CTRL 0x63 +#define RT298_DEPOP_CTRL1 0x66 +#define RT298_DEPOP_CTRL2 0x67 +#define RT298_DEPOP_CTRL3 0x68 +#define RT298_DEPOP_CTRL4 0x69 +#define RT298_IRQ_FLAG_CTRL 0x7c + +/* SPDIF (0x06) */ +#define RT298_SPDIF_SEL_SFT 0 +#define RT298_SPDIF_SEL_PCM0 0 +#define RT298_SPDIF_SEL_PCM1 1 +#define RT298_SPDIF_SEL_SPOUT 2 +#define RT298_SPDIF_SEL_PP 3 + +/* RECMIX (0x0b) */ +#define RT298_M_REC_BEEP_SFT 0 +#define RT298_M_REC_LINE1_SFT 1 +#define RT298_M_REC_MIC1_SFT 2 +#define RT298_M_REC_I2S_SFT 3 + +/* Front (0x0c) */ +#define RT298_M_FRONT_DAC_SFT 0 +#define RT298_M_FRONT_REC_SFT 1 + +/* SPK-OUT (0x14) */ +#define RT298_M_SPK_MUX_SFT 14 +#define RT298_SPK_SEL_MASK 0x1 +#define RT298_SPK_SEL_SFT 0 +#define RT298_SPK_SEL_F 0 +#define RT298_SPK_SEL_S 1 + +/* HP-OUT (0x21) */ +#define RT298_M_HP_MUX_SFT 14 +#define RT298_HP_SEL_MASK 0x1 +#define RT298_HP_SEL_SFT 0 +#define RT298_HP_SEL_F 0 +#define RT298_HP_SEL_S 1 + +/* ADC (0x22) (0x23) */ +#define RT298_ADC_SEL_MASK 0x7 +#define RT298_ADC_SEL_SFT 0 +#define RT298_ADC_SEL_SURR 0 +#define RT298_ADC_SEL_FRONT 1 +#define RT298_ADC_SEL_DMIC 2 +#define RT298_ADC_SEL_BEEP 4 +#define RT298_ADC_SEL_LINE1 5 +#define RT298_ADC_SEL_I2S 6 +#define RT298_ADC_SEL_MIC1 7 + +#define RT298_SCLK_S_MCLK 0 +#define RT298_SCLK_S_PLL 1 + +enum { + RT298_AIF1, + RT298_AIF2, + RT298_AIFS, +}; + +#endif /* __RT298_H__ */ + diff --git a/ComboJack_Source/ComboJack.xcodeproj/project.pbxproj b/ComboJack_Source/ComboJack.xcodeproj/project.pbxproj new file mode 100644 index 0000000..03c8082 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/project.pbxproj @@ -0,0 +1,278 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3D086A6C21BD498700FFD44C /* PCI.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D086A6A21BD498700FFD44C /* PCI.m */; }; + CB3D2DA81F0DFEDE00CF6EBA /* hda-verb.m in Sources */ = {isa = PBXBuildFile; fileRef = CB3D2DA71F0DFEDE00CF6EBA /* hda-verb.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 3D086A6A21BD498700FFD44C /* PCI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PCI.m; sourceTree = ""; }; + 3D086A6B21BD498700FFD44C /* PCI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PCI.h; sourceTree = ""; }; + 3D2BE1A921BD50C300FA7A55 /* Tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tables.h; sourceTree = ""; }; + CB3D2DA71F0DFEDE00CF6EBA /* hda-verb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "hda-verb.m"; sourceTree = ""; }; + CB3D58431F0A7DE000F741BA /* ComboJack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ComboJack; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3D58641F0A835500F741BA /* hda_hwdep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hda_hwdep.h; sourceTree = ""; }; + CB3D58671F0B219000F741BA /* rt298.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rt298.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CB3D58401F0A7DE000F741BA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CB3D583A1F0A7DE000F741BA = { + isa = PBXGroup; + children = ( + CB3D58451F0A7DE000F741BA /* ComboJack */, + CB3D58441F0A7DE000F741BA /* Products */, + ); + sourceTree = ""; + }; + CB3D58441F0A7DE000F741BA /* Products */ = { + isa = PBXGroup; + children = ( + CB3D58431F0A7DE000F741BA /* ComboJack */, + ); + name = Products; + sourceTree = ""; + }; + CB3D58451F0A7DE000F741BA /* ComboJack */ = { + isa = PBXGroup; + children = ( + 3D2BE1A921BD50C300FA7A55 /* Tables.h */, + 3D086A6B21BD498700FFD44C /* PCI.h */, + 3D086A6A21BD498700FFD44C /* PCI.m */, + CB3D2DA71F0DFEDE00CF6EBA /* hda-verb.m */, + CB3D58671F0B219000F741BA /* rt298.h */, + CB3D58641F0A835500F741BA /* hda_hwdep.h */, + ); + name = ComboJack; + path = "Combo Jack"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CB3D58421F0A7DE000F741BA /* ComboJack */ = { + isa = PBXNativeTarget; + buildConfigurationList = CB3D584A1F0A7DE000F741BA /* Build configuration list for PBXNativeTarget "ComboJack" */; + buildPhases = ( + CB3D583F1F0A7DE000F741BA /* Sources */, + CB3D58401F0A7DE000F741BA /* Frameworks */, + 3DF6155621AAD40A0057F150 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ComboJack; + productName = "Combo Jack"; + productReference = CB3D58431F0A7DE000F741BA /* ComboJack */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CB3D583B1F0A7DE000F741BA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = VerbStub; + TargetAttributes = { + CB3D58421F0A7DE000F741BA = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = CB3D583E1F0A7DE000F741BA /* Build configuration list for PBXProject "ComboJack" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + ); + mainGroup = CB3D583A1F0A7DE000F741BA; + productRefGroup = CB3D58441F0A7DE000F741BA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CB3D58421F0A7DE000F741BA /* ComboJack */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3DF6155621AAD40A0057F150 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n#cd \"${TARGET_BUILD_DIR}\"\n#cp -f ComboJack ../../../ComboJack_Installer/\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CB3D583F1F0A7DE000F741BA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D086A6C21BD498700FFD44C /* PCI.m in Sources */, + CB3D2DA81F0DFEDE00CF6EBA /* hda-verb.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + CB3D58481F0A7DE000F741BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + CB3D58491F0A7DE000F741BA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + CB3D584B1F0A7DE000F741BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + CB3D584C1F0A7DE000F741BA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CB3D583E1F0A7DE000F741BA /* Build configuration list for PBXProject "ComboJack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB3D58481F0A7DE000F741BA /* Debug */, + CB3D58491F0A7DE000F741BA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CB3D584A1F0A7DE000F741BA /* Build configuration list for PBXNativeTarget "ComboJack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB3D584B1F0A7DE000F741BA /* Debug */, + CB3D584C1F0A7DE000F741BA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CB3D583B1F0A7DE000F741BA /* Project object */; +} diff --git a/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..bd08605 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..05990240b3c672b9b5bc4214f61f286098bb663f GIT binary patch literal 22648 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 Zk#~<=JF>4IETqJLxwqV~LNs#Y{{iX3$QJ+r literal 0 HcmV?d00001 diff --git a/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate b/ComboJack_Source/ComboJack.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ff07a0b58bcf8bafefe6a9b72d134ec1306f13ba GIT binary patch literal 19444 zcmdUX34Bw<_W#UXQrdJ$nx;*gE@@MQwn>{NP0}UZ7br_9EtH)S+CT$sQBG8siP!<(LWZy&tMHT@8SzOSk2#6@C;BO|kNm~m(-+R8#|NUvxBy;DUIdkUB z_nbNBTt+w4S{+V}<~V?W0yJO%3j_j#z&JQ|g2nEz+Uf_#+D4DFR5=|(V$Jrd8Y^xd z5bLxx1Ohm7={hm|6nKFyKmvk*6vTmekN{Lb4H7{T(12v11?eCIm_QNe1Nwq;FbE6= z!@&sfAg}`maDqlK0Zaswz+^B5JO$=}r@=E|E_fC^2j+qK;AOA~ECo$qId~Pk4%UJ< zz-I6c*bWYW_rXE%0XPH>gAc(G@F_S0&Vvi!3-C3#2Cjo2z;ECVxC?%V07A$@ZzzN! zD1)Ie3`W367z4FX2UDOP8lVxT!Zer-b6_Ft2TNgpSO&}C2sjc}!Uv%pI-nCa!U=F9 zoCGJsY4BnAD4Ypr!>8eMa6ViBn_&xF2A9JXa5Y>D-+*tzU2r$t1NXvxa6fzx9)=&n zWAGgO44#J<;6?Z?yaVsT-zh*rilS(Wp}J7Ml!ywVWK=j6O~p`3N=+qFNtBKWDQ4doysmG~V)DzST)Qi-7 zY60~U^$N9&T28H?R#K~|_0$IH4Qe~JgW5^$qIOgJsl(KV)JN1w>J)XF`jYyJx=ejd zeM4QLex!b*?$CgSv>)wH2hbu~OiSr-I)aX*qi6-)osOg9X$_rBYw04o2i=n{rhC!7 z={|H{x`ggWm(u;|GP;}|M311&bTwU1+i3?qk)A|9L{FnRdLI2e{Q~_WJ)d4czeF#j zU#6GPE%Ziu6a6;5nSO`fLcdFIr4P~{(1+;5^oR6E^m+OMeUZLIe@=fve@TB!e@Fj7 z-=Oc%cj@05mhonM7!ec9gfodu5~E>~87-q@QW!mx$`mm@n4U~A(~IfN^k>SL!OTcz zG*iV`nL4JPnZ-Q8%x0cso?_-OPczRjbD3wE=a_lSi_A;R%S;o~%&cHmGOsghnYWnj z%noKJbCCIfImCRzoMcWh-!oU4Ys_`#2j&LzBXg7aiTRni!`x*VmSqE25i4c`*>T!Kb|L#RyNG>-UCgd#*RZd#ud{2}x7dyByX;Q(Ao~G(i2Z~;$(~|AV?SrF zu-~&++1u+dtDM#eW~ZgPQWRET8Dnm&brx1zoi=;96Sq2wZ1#a=eH_DG-7Mu* zHI_OHCcu9!YpgG@IGomcvlAm=r6|BXy+PLcYTHByCdq%wwcE}0WAUx^&H~Hm#<9iq zV{Ev4xuq5(rls1`T~=nP!hLuK+{DQE-fl_gfB|%G1}Q*~0+6T~7(pr$qqSsK#=%v# zYD=Q)uddW?BWPUS*wA3JI}F#K+})MANE zupoefkfc&nHpW_ONl!{js<72!^>8Hh&CM?_%TKDZ)s41|GgpmI$|s+C;ZK!3AACbs zt%kIi7!PVe9jFI36oZsVkMdCgDn#XIFi|638QcoQD^981 zGQnzVbhK&}-^>A`8^6m}k-g{IpK8YT<|NZSJQz;7R(2*boFFW_Pn+hHS-B*H#z%=kMcmyE8 zfk#m+>WUsf-B5QFhvHX)>0kz!2_6Ttz!P9LNO=}-z;Vp)Eku0WrfqD?N+ z4ADR&TaXZUGCxLQpomq`a-I^r*}3y#kgrfyF2ZX@=(88YU~SEG!P5 zTr+6FceE128rA}u!7@;W0S13@v#7ab$jREk9SD;cJ*d2GGa z*;tL6qTBXr2QJ!ZbW!G1j{@W$FQSFuqh=ymH%lLb6P;L^fi3qbtfhV^7iBARrtNHZ z|5G86T-PwHy47jHHUkx-o~Q>Z`>)t6W$w-s)|aBr^>Ook z1N=-Z?2q6k_zCqwy-}YQa0}c9zo5RT1ocCz3LY9Ncm%os?rn!-t?<%GRzo~k<fq_th2B3k>Pzr-l1sX(lMmRsZ%WuQjkdJY~+<@W8wMi;PQT$~$So4y@ znAK2gp4=CE4g9p_;PO(`zdYCD^};Bq=&&iF62^n>D_|__3Lk*oV0RdYhN59;I2wUQ zqRJI80ji)HCc-4BL8Fiv)uO3r2AcWr*w%l+TK;Qh_+K=Be}`@T6Vv@qOdd>!CJcix z1C4HinW*YdU=ZeF7=(E+A5|l(2L@pg?1eE0_JBQMF|wdBXlx7Y?SjFY{}v3o6?Om| z+-c|`KmmuLaTxB#qwG>;&g>c&-nnlX1#7T{hh{h$R>5j$fn(rUREO%34K<(#ksUc! zf+yfOI3Cu*I#>^F*seQKBbtaNp~+|p5zk+?pMSr-*A)~QlJ$CnHaR!9AVrg_(ddmu z$@+G#z&+fKKXC=_YvFn845wi045y+A*gE6$m;yTp)&{rfg^xhgaq~U~r*~|49M0<4 z@FaYSZ{Pvp8G?gz(L?Qw1)K+;2NmEddKgVZ!Ke)5_Qlji_O1uq3-}Uz1>-hc2w#Sa z&?5*Tt_3azx8YLsD8}u_{#M-Pxm-!OT!p5$q4gU0TE}^cj5i(YI)s^jn!fr}IH6L=CmhvuQ@Ti|IIQoZosMygBjt3M8n zj}h%0Gq-ww2Y)2^bOnA7ufl8aI{X3NKnu`IXd!wTEkduL#Vg@WFa!P!Z^7H}7w`mH zf_=NCs0lTr7K~MGCy;x&{{Jr!snhA9?c8z?u==o?no%i~o)^GB1urU% z%EsVDrBfM{iOQt1&^ojMy@@uWx0h2nR4$cAUd9drPFf-a#e9l}&pu`4{YzEV{1 zZ$^IHA*s^*;>4PEfgh^GMfr`thjLwe%H=M~Z&iwl|3jW@s?BPgwi%sR)t>xd7x_(< zqN4whyxplyOYJC>5iZ)B|3=oaWLyz3Y7}Jw-Iq~jYBW_vRiiEFU9=T#TSkqc#!@wu z6>Uem(H^vy=xbP8Y?D6~BzjJPl_F*5i>?ra>zI*f8#4ySe(+#V!yi*?% ztSqwCR^zY~ulNl_@gGDxP=Efr6I@z+K-P$)O36_dJkm}9D~PjjC3Dk`&jD7I%~vT^4&Mirk)|9dXjpInnOK} z-bV+~2k6i;YA*FG^&B-19Y!Ccqv+WGmZ%mIQN4^lbc<>+5!DiEDS4rf&=J?Gzvv|q zROaYfMK#|&<5#KIcu}pvqB>4QwHAx&1j_!SkkTXFx4cPhCPI3P+DL7p-bN?UDRdfr zx{P|qrB7SY8J9kt|KAeQ9wMZ@=&V~v?-3y#px!4hbPj#ydi576MU;D*NAM??5*@{o zxj-ay0!!v%XUUj{yKniFI!`2XhB`}~qdr5Qqc6~x=&NPa1(#$#N0(ia`R0F1GXEfw z`4)Zcmdy7=GBx}U#s&Vz9r~bdQnz@i{EVgYk7nvN^$YqIeb-4U{I0$0iXn)@b*&Pj zDH=ykmeDlL&@3%L-=nMO8oIuW?m~OhKC}@1fPO+hqg($|5~2gKglGx6(JCQ27)yu_ zp=IQSendB2ul{0cj)+m_B=S2UNiAa`%f>m@Tc4qg{Idm?aN9O|t2fgqKJd=Z6IOxqm9}Wuf_v|4~S8k!a zp!ZO#qp;RGmXC!7^UVb~5mIF-b_}xOB$kEbKZ4p{aJx8_qCmbmm()TyaVD0wfYuOR{X0qCbq7Z>z7eTb!0*b>=FYV^XpvF*&7D6jMFHS?%IU zU5k?ywQB6%H8kQ-eY)#wjm_b#n3QU$G^CV{>}#&dv)RVuBu=tUrFH2lJpgQL0{)2h zoIvQo^iUFW#%)dXFb?{Y$T^Oh(jz@R`R}8_wxuYK|7-!5SAuLRi^`;}^f-DvU5nF! zZ=;PI6mw9*K`94Ah%@KO2htA`%g@2UzsDbH?`hE!c+x?C59#)<7Cn_GjWdJ)6<-T{ z@A8Lwxb^!{dNw|2(T~y7=^6A)`f+*|{R9U?IT*%4IS0cz7{S3v4o0oSdi@lBJ&k+J z1q!0nu0PSP%Sx=)A zt39!f*YY%}dAWu9LUpoEXHci);!ml%!d!JxkuKSopPE;wDa5&}&^EShw%XC{W{5Z0 zR6f*p^G4v&pbP$lUN#`H|ShN4m=*C=$U3NpANRhOpF;GblJMnf1;48&4PPsNdM z55%=)k1=Yr7Yr}uQamHv>W-4PiSbx~NE|2$YAwkaJkhn@#RV9q8c3a%!--QpZMhoc zEuv7D3Nm_f^3f1kXxP2d<&~nylJZi|?E{Mo>xt)DU1k|$v0Lh^EX|?vwmf=7WI$B3 z@*ZU(O$sDzia`NLa;)nE0o}UCVU@&rG7M^#`ab5#wnpc`fyD(p*5gTcyi{(TVnM!G zk^OP$h#@yWFRdsyU#-c@)2fa6xkk0ln2f&~HF`r{esXSdzINDDB3+dtO{1BHXQocX zNu>5;HLK;vG|2&49R|_Rl5$?GJRAJy*1Ztb@mhNlt{zB)>n|{j-CMyrw!0YO6)!}V znua-QKWuZV95b3>>X3qL&XAAPOfrr!TXbpF$wsXP$58`H%5i?fQth%W_`r5v6p)jf zmtRm=)T3u{uikz7mh>y_UsgV#ykgMcAw!1^A2Gr`kc(ryGy|+olHU{Kh37fox2(mE zt9r9225`G20 zf!A>9T_UBSv^WsahpMKm)FfO?hwyP}E@2;EuDo++eYAG zwudolzlh7%7Sf9d&d^J-Rc)b{(<|v$={5B0^g7;gq9FecMz+4UzR_=RFvgW(BX{C; zbmy%xR<+=!W>ALLhajxmW-Oy|+;=4&VFeyz6&__Zy@rFa9PG-$2RPV`gWWk8$HDlO zR1Hwj>*)3L2K@dec6o7yR00QUIoLoxK16IrFiw|Y&@j7ek{tY!;zh>jQ(j}6SYn=F z9c#vL&o_C#=Hdz~zNxt0(SZFQo1Je`wFk2fD3432tYhm*FHdH?2L^d21ap|{gJ=$-T~dN&7E98_~Kk%LJb)GVj>();NB^n3IH4kmN3kb@;0 z9L~WJWRiTmDiISVN#lOpm7C#iY9U6ee_xS90yZ5n2qDd*e}TCU>=z?Da$LI)L_Q@m(P$6z&MPHZg8`Q zp$^ycEMshT3$A^@&Ly4(-#r?4=WEv7rpVKwu%37TxU4RmNF~27@dX+kf4oe5kJfqv zOb16&0!Z)Hx;Qe1d(vOgUz5YZWe%n_(cf?|ozxbR&K2fbESp?M`_5PBtJsI7zvo~^ z6MckK z3_f4vpltUg0n?fy$MS7+IJCxOmBN^+o#rm|V1$fc8wr07rz<@q#EitlI)gpr0urEf zg|wIuCX{&Qw^2!xi^aAp5lmOS>6u6-icv7pObnxB@QyFyU=I%Vd8rmXv@92kwP*{YoD-oed;WwW+zs+dbd+>F9NN)!qdh3O4*J;D>e~s zJ=TV>;ySf32G0_32D4xBC!2&RX9l{}3CzF> z;L)=o%&;~p7$gU`X=f!f${mOQQw6VP#Pwq-PbS; z^a;k!I2b3>$V^}+GLx9e%oGlebU|Jv2S;(x%)!wdtm0rb2Q3^N!@;p@z&>UgP%w{B zOBs&*5Lje50){oj&{@$D4vyo0d5j!K)|9M9q1|q?{}HlU5e@4U_SPHhI0#^=#^6>p z-sN3k4J4kq8^ZVPF&FK7 z69TPmtt4^kn-nbZhaeu2JM&Er5}pxz*lmpsm`JB})a&rUh#dKu=i83>%zS3SQVx#i zYr2*(3te???)6#3EXJzDyu!h{CT0l->xlrP8yyxq&ZXi*g56S`kE^N2+U%1HC*dOq zd0?ctfUjI*T5w>2S;pZqhCIA`J%*InVvq0OzB`e~$vx^SW;Gf0RSrJb#9$}KPDZ^? zeH^n6Y-?fGGaDG}Q8_p`frFDhF%M=V^UfcOG?*<|WwvtANmQhf>?4AV9snfHhcf3u z-c55ew2Rr-iOhaX20I-S37JWJNUP0#QRY0e(?!Bf;V|=YCkjU~h2tEYLMTjiGve`w zct#p>I*>Wdd=9$5%6!V4Va_t=n9rE=%mwBmbBTk~IQTFJAK@V4AjiQ+Irta{r*m+| zt9Va*2^1s(%6!B8gZY;Ej_i<`*ec*)CJd|Gm6%bRF(JwB3y&3BIGX65llfnITzMQaF!C zYv&v)TD!HKP0Micx5a_axO~~}&|25IvYl(d++uzqN`o!_<4w%39Gpd_)0H2;)w#VN zIrk#{&O%Ir1sr^$iKRF=8>t46lTqt+R>1n;MP$9$F03~PpXA_E9Gug_3aJ_vFX7Wf zn(N3q#&sB#_(zs<>`vE@b$#@dp}M?9X~({;Mh|06hxQ&8Tb;#e=j|IS!4X^*yAaQK z@~CVGiyx#|$;#MJHjI_C;cNsO$-%iCe3paHac~|7pXcBU9DH#lt6-zq7*>gYx`J#D z&gb9)4z_Ucb=U7&9N<$8C%cgxJ_sHS<2iBhj?t4poDvtXX%;V3Dp>Fr_ z9@pgVYi-csDOermzJ_ZvF?!>woyHcTgcWQv` z!omG(A~q2Y>Oyizoo|2qYiI~wq|0N z@JVA*zcKE6+pckNH3ye-@HGx%EAVQiD9K|3I%q?IjnGW=IC7rj89&8ZGQ~O$uE0}d z8`uXi-*&v?oI~428tCGIgDc4vT-A0Wa2YjrB0GsU?QN>d`<<@4O3hY#Gdr2ouaX1J zefvlr`JMlF3`ZP<;2)rZod$|gFbCHlz9O1MEO+lB*Jk!nLjPX%uRM#>*%^G$wS!>V zcrwxX5im`%0f%07X`Z7H`waU$&W*8i z*=O13Sd2f|Jip1ow>Y?Q8T$hJBDIvou(OGS?-DO<8$OTqv5axmz7Hw0j;(Qh8p`9g z%k1#Zm%BdRV?W#ou!LPkMqA1@vCS+7v$r|8nS<|eaLY2VkE$VOBJ2Y0aUX`{6=u7Y zU>J^nTPC_(tupgO{=|vv20C7KA4IBb#Jf{;xahhaKZu269IpCAn;mc2;0|3})CrKf zd0oeDAZBJg2e&p+HJB+31Y&%oa@cBHkKts-?%tbNoS$xWhFCnI?X7tmb}OzkW4E!} zIk@>K80N`*$qgWxv6reapcE zgw^-)XjsX41EkEcj_NSlHTK6&ci#m2*q=FEqK93aLj>GOB*E=r@GjNxjx+v^y~D%h zaRCrO0R@Bt8WamyfdI#{hpXM8^7rgQqxnq#e==0tFI+^a2c7Cph@A8<>x~wzfcq zx3(aZgGW6uD+nhr%fVxRK-E7*!VdEjJb-5yKw+Guuzz}z@O6rSB|d`)63BQg77EEj z|kDwFaoB# z@H`Bv^YJ6Xi!lZ^vu6dqf>8XxZ;T*T@PI&#Wt%L}3G{+IK`%jtV6b4QV7Op|V2fa% z;6uT2!D+!I!BxR^!41JpuS~CAUVXeuyh^*c6;sh+V6GJ z>$KMyuXA4Ky)Jrv?)9bDWv_3#gm&rC#onc<%g5fpJICAV{h0S$?b=JMb?>d-+r4*s@Als7z2EzQ_d)MN-j{uRd{TYNed>MY`@G?^!)K?@E}uO(SzH@w^_g&<>$#;+MUf+Gb@A)3_J?4AD z_oVOFzCZZ>=GVo~#}8)&{X~8izk0u^evkT1_nYZA%kLS#XZ_~+z2G37TT7r)>9z5RXsh5mm2!TxgpSpNe5-u~nLIsd2q=lQ?jKi_|m|6>28{>}co z{6F{q&i{)4RsS0SAOHqX0Zf26ATmG^5EBp^@IXNKfcOAoKw3aXKxRO8KyE;OKw&^* zz|w#Z1MY~_qT!+mqQ^utMYBXtisp!(5w(b36KxQ^DcUG{TeMg7f#|U4BhkmAQ=(5r zXGNchE{MJt{VMhsYsJ~(B5_Y~FL57nxp<&>ka&oAn0UC@BDRY;@nhl{;>X2Lh@TYC z5kDhdEM6*Z7B3U85U&!i7QZH5D?TayC9r#7e&EQ!$$`%Yz7V)Luqm)5aCzYRz-@us z19t@O3j8qeqrfA9M+46XUI@Gx_<7*9!0UlO1pXL!M*<|2gpo)kA(BvuToNI9K%$eR zOH7h1Nsgq4q*&5h(pSce+mg+acO>sh4oKdY9F!cAd?mRd zxf=w6s30at5Y#0|5+n@@2?`C82So%$1@#M>60|Dlq*NePNYzq}R4dg>jnXt}UulJO zm~@1+QfijgOB-@Y>#Z8?1=2B?6~X`*(uqlva_;pWZ%lJ$gYMOLi0llLwkf4ht3Us zC3Hz>Q)o-*)zIHU?}mXeDy(UBizYxA4d|~*a z@a5ra!`Fwu5&l;Artr<-Tf(=7?+bq~{CN23@H64(!Y_q?5&l*9*Wo{h{}SO9A&Ll$ z2#N@fkVQmCC?mQ?bc=|KNQmeeQ6KSK#D<715!)hmMC^(<7;!A(M8wI6(-CJP&PAM$ zxES$$#EpoX5kE)#7I8NcL{gFB$e_sR$oNQAWMZTyQX82OnHiZKnH!lOSr|Dwa#rMP zksm}Jk31Q9I`T~97m-&YuSQ;vyb*ab^5-Zf$~#IJDR8WB|)Wsa(fvP6xInjW<}>cgljQ9ni9j`}s~jzXXaP>2;0g;Wuu z2vvkDA{E^f@d~5Dq{vd_C<+xl6vc|(ilK@TigAiMg-u~sI298V(-luEURJ!OSgY8e zcuVoNVvAy%Vy9w{;<)0Z;H<8+|PLZ1nl)i_xD)UyHsGeKY!2^smu(VgxbXF~S(XnBbU@n9!J*nB*8;j6TK~ zlOB^9lM|C4Qy5bgGa#lSW=PD^nAc<0#cYUqE9O^a7p0HVR~eujrmRtpQ`Rc$l~a|o zm2;GHmGhJ@Dqm7AQZ7-hRjyaQsobdCtbA9wUAa@aTX|0TU92=VCw6pfOYDx=ld%_K zzmA&{H!W^v-1BiS$2G^Ti`yQzD{gPxdvOQj4#ypdI~I2-?u)pu;=YOdF79gF^|&A7 zeu@u>kBQgE_l%zyKRbRw{POtq@o&a&ihn15Yy6J*gYk#skHjB~|0Mo&{F(T>36Tl? z6D$cc5}r#~lF*#6JYiMBnuN6p8xpoB>`K_1us`8I!UqW-CLBq)tO{18tA?m*R8v%s zt7fa_sOGBXsa{a6RK2BoTeU^CO|?_CTXjfvT6ID7x#}y`*Q%?kA5=G0w^YBVX*Hu3 ztAo@b>M(VLI!diltJR5Wjk;OX@GwU#Y)V|C$()SddtgI3w}Z z#E%kBC7w<^llXPwjl`c4Zzuki_4&77Nw<=IO}eWA8b6J{CO{+Bbl2ej&_k1< z$-<9)6(`{i#1J}Wtx?m)tc8e>osp`Hfi3`Y}FjooY0)oe5yI8 zIj^~-`BL+><{z5xG*>m(lYNsDlJk?xlE);YoqR3%cJeRDziC;mK)i=?>}+>yGG-=|0h&)}7Uz*Im-x)cvgcMfaQTZVE`D zQv@mADZVNGDbXqEDLqpvQ^uvBl;>04PT8IEQOePj6Dg-s&ZL~vv-&{2R4>!Z^^tmo zzN=oVPt%+9+4?+vvA&PKMBiUuu75;7U%yVjS^utnyMCwsu>P$6y#A8@Oa0gSZ}s2n zuN#1YHV6#f246#fABwrwpGO&Kf>5TrgZRd||k5 z_|fo_;g;c7!yO|qQpRv&S7Uc$f>CYEGUERfz*uDLY3y$tX|x!}8m-1!qr*7CILSEG zIL)}!xW%}~xZn7`@dM*2<7wlk#siRXZsWqwNQ(sA4k@{-t zYpH8f-%Z`0dMNdy)Q?k-r+$`tIZcozOp8y`rRAjMr4^?2NGnYnlQuq$OPigxF>OoQ zmuXki>1^i}CQ(+{VA zl72eR~88GADJXS|>BLB^?!^BEU2KF|0voXtBoSiu@b7AI+%=a@-WS-3YH1k~Mh0L3ow=#dtyqg8Hm@L06QI;f2niZ4PHLF`z zd{#&APK3V;;`e%*Hs>`xv*|VHk)3Q+3V_7q@p3d5wwJqy%*0t>5Y8$+(HNuqChYK6}R4Nt^3w$ZQZJ% zb>CWBw_2;#)>^H*)^66eTD98Ny0o@x{m#9Y1gLg4u@HE45<0D|_5gc`J;Hv+9wQ9dBM0P&+);Prf#OjDN<>L08Kt1!C>8ZVeNh@xqI9G}8Ay%# zqZ~8<4Ms!IP*ja-kP(eQCS*Zl5Q`?G8E77wkDf;_qQz(ldIhzjRj3ZViguu#XfN82 z4x!`d1UiXMq0{I*`V@VKZlRyiZ|HX%#|gX(?tn{hSKJNng@@x2xEznf6?haLjmO}z zcp}~xPs5dXI3^!#~20<0tTw_$mA|{B!&Z{33oCzlLAO zf5dO$ck$ow2lzt*5iUe`!h`T8d#ChT(@g;GIxJFzj9+Mb}NSq`{lB7tQ>_Xa+j-(6eO1hEm zWOve!l#>2r04XDTkxDY1RFN5^n#?4#$ZS$W_9OGi60(#WMrz3lvW7I0&yWnsl9S12 z$tmP>ZO=)G}%X)k?iet)n(l zTd3ElH>jP|9_npsKlLv4K6QjTMxCHeQ|G7))MwNs>N52mb%VM|<1|5&G)2>N7ut^Q zO54*8v?J|Ai)d$BOiSneej-&h1X|$5=Pv_9N^gz0dE~kgk zwR9a_Pn+llx{)43kENUGiS)DdGDBbB^m=*&y@lRNZ>M+CyGnxU zn`&#%U{06_bH>D&3+6sBuSh=9&}jf#tkP%70?5lIQ^=*$dNRBUE?lveDj$xsh8nMYb0bb3RE zN#9gwsBg3u?1cqjvb9(b%p3E;d@(;viup4XLo;0%JEkjR&p52b0RANl8%=>e$SpC zU>=-Tq~d^?$9K8dMm0y*Y-(z>Ky*=KbFCp)XBnv#yI9M#b)F_eC^pO7z?TCYXsX5z zv!=^ys;e}Z8N?6_ZP%5-y8;?X#$N0U$aEEB;ssm9ZlPg4Wxc{9XT?#bzW%M=MoBY@kn6OoXcC=0P8J zEUYy*r7PJ)|1~um#x`^(fU(m1U0jM^1xC`!$r-A~b0kx$J*MqWBjT`Zicpa!K^YGR9 z8hjlnC#OLD_y)g?-vgz?gGeTN6Mcv@qMR@jV?c$N0cyii;uVbl!IAKd4Qu;u`yw_o z&Zn^?EE!9|dOr<|AU$%M8aWxviQiR_EEVemQh|GG$6(vkl?F{CTZbvJbWDY1U}`KA z%fhm`?qXaRSH_KTXSy>U>tOEakL6&wSRR%S&jVog@M02~-b`Oc3C{&gB#0RpZbdbw zF?qVt#%di*145APRcSWBWWc4;)LR-ruQr*5AeUT2oypvsW!5#+WEd)&s;dp=A*Dvc z80(8x9Nuw&cbXtF3>IT`Jx8brNhB`|zNENNv zA96u{kat#5`D9jZuFq%&foIfnaum{LnN3X%pc|-Q0@pQI3{~mPB^GWbcjlOAYdN6+ zuIp?~)ro<0!*G+?U@J~Y?%F;jM<+yuOOxWGCr-3B+GK1B=H7xm%Y?OH&oMnYHHs^+ zR9D+%uqgQ&S(DDdW?`}xY$gMLW;4B*$a0mbuF}*`rypreG9Sc&Y!&uA_5!wm31=c0 zIrjp;@WTB@7PRLnD=?d?ppz}a&|8kZ!q1G>fo79LtFYxDV)}HFPC}LySW7DxWi5Rb z_NuKeYnW(8VU1XiZM1Q|iHTt%tr1(X*SLrmn1~kabtbkw;!Tie5V3=aYvGxX>@Yc6 zGw;Rr*@}CINoX(bAoeaMTe-5G+WXiC9JRwtQVVv3N#+KFe-m_Wftj1k%!VozEO@J7 zz^car6u5P>CIgyU#*;-#XjZ+ z;W_L)lgjjI{limIMFbQp+K@- z(HO$LwJWV+c;z_D)m7IU8=IwqgMn!;ZsQ49^E)BQ6ZyMAepe!{ zzA(E=kv|GRfhY(CqY!2QQ^*uC#Y_oP$_!-6m~v(iGng5|4Bd>vP){U7y-+x`Qy7Yb z_b8Z_V*n7t7%fx57?}~kh$mAE?{&;G%vJyj^l7vpNpf{#jdh>|!9Z`&nT-}xeJ+S= zEhm`T`dX+vA1ao%y)@M}8XI7}!p$B9W@8Nw@bGR#`5Dt<+!6$ds5 zOj--&4OXCNcFYAM#~R%>FY=jTKKfU3)OM_~kgwA8yUt9>z{#-;6Gu*N6P-3)hL>;XSu}k$nu4A~Q_(c0foWt$Gh>+MGiWB71>Da@ zbI{yD?d6s5oG_ypGh-RtRNqj`>2g(JJ;g(WW_kfF5cCwmgeuqxI4z~E<&5T5v=Hm_ zH)+~R$9ABX&|D^tX<{s5!W#Gj2#vWgmk(nsRxVfYL1Vd~_6c2>q)wyNt=ydSDO!Wp zqIGCJ+5pwsh&G|kyr#bmy#{ztq1VxN^agz199-3Af+;D?0iDXys53VL|DXpo)zu3t zUl<{V`l=@aCHfkjSqB=WxlmVMZ2(X~XTp5OcQe0Sge(vw@KuhEA9?+Rcoo`% z-r{=o&k}%Gf~;2fTC)k1-$wfcV^b&8w&SO>;A=(ia0PJ+>pw~_fcyYuhu<(_4xg35$G2HaghpTL4&-vmllePbs&Ty|y}v*iN%41JEiKo=qP zm*^7u3I@S9=rX#3zJ_SfinR zZ4D|@J-?!B6BvI?FX>7h=PNR{IG}UxjX?JLoPmlbOZLwuz&T0^u*j!DC(=%;_u+&Y(5Wq?^!IoI-Cf z6PS4nhy_?=!^*zv)8W~Q+jCHR8gkFzj+isn8UU^{AG45oky*sN#JtQbW|lBZnPuy7f6$~rp~i#p5IhvVdos&mGUOJKt;{NB z9el6nCPpt|kgGsn5^yKC@QXOmKtLEj83}q!uCX4JB@jyfPmShCsZ3y?(^Z4+>i5(% zn)=a#Z5b4kz$a7aIrA`#phkn-G<>+l0BhVQ=`@UW?Zu1~)NpFngGB%t0oyj8jPk3lK-qrnTEN z-9dut$}IrOdBv4WY%OLqKAtOP3_ccb#>X*lGCP=^%&yf~5DLR5!Sc}wx^y=T9&Qm? z3hN6_dw~U;VGO^bEYyt=%n&e`I>)wILyGjK2Ed-QQzW0=WNrj2mfmb^fGGp;=iVs^ zPo0z30syA+0I>2r1Lv(A+)5Rn&Ai1#3W?@{a*fZ&pJ(QO@5c||2l03DL->36`@qU^7QM!zH&}FtMPIY%8x~z*(YIWguIaF3 z9@$_5oyWrOMuA)bvzS-gYDj<|FKsNDCNs!m%MfAHsz_gB;I_tGh1bHSdgv`s`gp}n zD^}#_EREcfv(^9v+t+bIwsesEReVNcV>3*h(AO}fVIH)Zx_-*C_(|i_f!tZhV2L3aMmizdxFyul1 zwe>{-Oqp$)XrID(`GooG|A(pvDi7?~mc1>%UJ&Y!@ZVvk?8x>X>%9tpOkkXJ|I1W= zqCp80C4m$6U?nFAf+Q${Cb|%I=o<3{^Cj~Y^9^%_xysC6OE?gYgcBhmoCz@@VXiX| zSmeke9~Q;1NX??boxnu6^I*ED6&F7pOv1$XZx=(_nlV*|26;^f*b+VXk}he*dH=PN z3RD_-UB@z{d>LQ=x69~Mk6^xx%Ubb(|5`m@2M6ZP&dnv`i}_Y7F8Hq%V{U{^(9Weq z@}*q+XQl8epq&#+A{~LAPNVgQI*qL8`U zrkxWdoDnNb_=Q##ewzc|xy9=#R;`>EN>uP#IiUru{FhdI5>W{X-+e~$2Tfc;b+LAK zH8Fx$y$K_z-oO2M7Hj$jVjKsKQLy1_AsUG$Vl-_0jwPCzhs-19cjhsRFc!g4JDf!X zi^%oFcpE|(9wE=Nh_XV2MO`?Iu*m*@ATi4=uqORCAeqO3WIl^%D@qnT6(!c5TS6=s zz_E;3%_2Llt5-0)S=9AOcqIE;Gp#1p3h-FNY+#YYUu3f8*i67y-g;sSv6a|HyhglE zY$x6z-XwOg2>MyXB4-wfStMamHx{|D$dyHI>xo@9ki5-(^602T$ZD2PSDEDBjq+-n2Luf%V} z1DIul;gA#gBy#2+660-1AOpz|9y??(hn?uZ z$Y#wEPR0Xv$OuwSMv@9Lii{>>$XGItMX@Y`zws$NN@W>E=?$~e4~|4-EX zdr>ok!^=z-6 zpq-9YBi*ziiWRadlRqM%}0($UZaxb@KLB7Mn7Jl2F1&gY=O$!zo|A(D_ zkDa3&c8;-VxD`7m06R}^TUdMVJo$-$lM5V9YC3Ez{9!?4&G04pwE&Q>IDm}!`wZ8} z@4$>kUT0Bl3weV@^_^@rsyi49A zehOEE>fk^J?-}@;CAU`H)2*>>63r#G-8+=!D%9tC3T%o5In!(MD5~rOomw z1gf|r_HcBylfkod`eL2A+R(Ps`xnXo)Ux<=ZnQ#)ye+fH(8!%nun6UX(f2=!<98J( z3gAQ0EE)|aOsXqvmVybBvZov883-E)*<=#<6HTizckXUZA>D9!vy_VD6d3L=J50nNn*z1pH|`*vz(n)mTD< z_;C#a%Jws`1uYmXsX$7G$<|OoR4^4ng;HS@=za`~SQbrY5iH)Pu;{rph@rxHYXn0n z7+`rSZ<2tA863bmvIcB}J-e})+g8soS{iC~&BEz5Pb(&*d^bzm62ehuIQ;*ob?ZbT zutPFyIs6t@r&K;2QgsHCz(}C&2ykaknx$>WM1dutwUXep0|hGOH133`GnGp9q577? zrnqnnfko5dfC%Cbb~M870i33`OqfuV(Z4W1znC{UQ%WiwHbZP@O5vmuAbS-AtFS(B zuw8f;%2H#;w~B+QOe%}YrZiMPsy~%OwEVbNL^tz*%8 z7JD!;&N-!8GOxHE7a&}kV2i-Yi8@c2o}#|I`U9c-^nNNWV8PlbFhYS+LT5@at2dZUa5B!qL!ylbZVaf3wLFE~qO2ly zo~>zNcmowpXDS1AW)4yoXcA>@t&{@{*H5;p4OAB9X*2RwCEVap7Hgopxn74CTRlNq z0NvF8fUY{XptxL{o}XcBcn~;1EB!y9m7brU1FYqhstb#NOKa1C-~xh~{{cau#euW< zDMUdC0@3V$N|YOId^^U+YK!x=G11y|&C|$k`;RNH&MV1%3ZL6~g35o&r!cH|PBl-h zH`sZh-s=B|UZy5bQ>@k&s#PVOItW&F|E9-nZK+JpFDV9c#U%jH;_?EUh~3K*%=o8F z+6b29aU5!tIhsK*cPLAW^KA%+H6HM&`llp2v|~wLp<1cR=EVaiw5_l_$Wu)FrxZId z3A00nHnSv8#f?QPx%d9>$dxJ!H5`jpav$*I691ID4nmkmOHoM?Od*>5k|L0Sr8Y80 zc`|=K_MRdD1#zPRl(fk(O_35NM3^b8yulHgzZ`piMpT(7iZ^ZXmgdt zDx2)!r_3oI1bReXeqLTlPL7qUPkAzV zPm&R`bF%=iIVcM>PoY(kn+_y_L#}%|%33&zN_|d!0m_@8kAuR_ow0f1%msCk`jR_y z@z=@z^3VnK74>ze8)4KH>MGnFqrPR)>n+qZ7Ht=95^;+XLFq2HZIWBpLElrqz!_EQ z2kJ-a7WET#o4P~YrS4Hbvj~hoAmw(lXcvn>H0@#0TPy;R^7eY_K4fVYzlpYhCrh8G9kP<3hw1DA3J>i;%U=aB8t50d6%^%c+4+ zFac-X-~xA}VQ`&JZ?cSyQpls?O8943>s5_ztm2uCsD-NlwGnzaNY(^*1d{pJ8k425 zbZlb0Ha@lhE&}P(;iMMyd{kU`R9i#S-Dr1M|I#kBEA7T25L557=PHj{`X8d{T5~qZ6ZWY0G4W({);LufI;14oi$816&OgE+_Z=>(oLS{DL?z z%}%hO>M?0Bj!CU;A5SMgr2=>`-JAAgV4-)CZ~6h!5`K+t&6Q4PJ|!2OMQ3x>KEuL| z0H}6gnph~aFxggK9$omfoJDjoUBaUCECLyJ0kZaOJJ`_1F7M5P9)u<2OWd`8^kVU! zdq1-4T5L9%8o~9ESnA;D;tJj?WW6Gjl2dvIrz$nz)giZN;2>>ft)+47_%?qjg2xNn zTD{E&16-C>Ho{`Q5`b?3KPi3;QC`%f*BcB~hN?4e?xOBqK2LF$(CXpIkPOw@!y6o) zcrk8p#XS>lCqqgwNtn#%I9D2?;1F;%0Wq9&1SofSX05K;!rjib9k_)^PLSDlN zzW>ly^% zfnypQxaVwmb{$zX=TUWQ?0?fG+B~k@G7y zFX7sd!v&)=tFz!4+N#T5tQ6_MNu3F+gui-lRq+)j#Vp{wVl@9$jp?vD_(*|+aQI|F zs(SdCA%z7S3E|c7e8m>ey>mIZJPizh~fd?+0E9H7y zDJIBK#g`@I<7!z2DL9%&NH-4RINtc0gPS%59H&sgL5UnPl~h1@7SPdwYrhCSyf+_a zEw#PoT-~nQN*x8fawTxB#?_vCYHt~#jSoP3H9}}D)DT>U@Tn}o%|pmDvMqPVJW$X1 zUQJ;Q4U6Uu&>QBtO)mHDP_1crAM|A49{EoQbky7;pE}$%M<8~6( zCucD!d|w8aZr9-HGg#JqPJLqIrvUi3;(=>>p$)2`9fY@bWa;@3t}klgm+O}&`E2hq zfex3Z0|i9z<#L!+@>ICkI{0usYv9{d=)Wd-ZiHSL&gYH*#I$qyM??X&!xQ#;VAAum z_aDKeo5Z_6u+>g_j@&imjN{=6!|UgJH8c!cGvR@up*@!C2g9_ypYyQE;figFn~K$n zO^Q2;i|r{CA1l6BoKv(w%nf1zoD6)M*iGyqj$u-G+d~{6cJoi0h`sRpnk`>vgbQuZ z8Q~n>^lgadTBxxNQysD2ag1~AWo<1ky|t%C{0Uw=B8Ka+f5uVA9u-ENbxa7o!;b|~ zpeRbzMI;l&iIgHF@`vAOQ5rl2iULGAqV5ozEeaK7h&5_#<-o@z{YvEw~D; zha6*o4>PnYH`?n#mPk9L;UqC9g#eLgFyDty8408>9QD$GWXi{+;65^rOly1Qq*ZVD zn>I`k1l(!jS>KX6`E3~pD4K|N}qC(Y2Z6Tr>tRPYrv zAA1p;tggUTW9z{`*z4d?XD@aDdmlRrPHWDAd(}%Yf8D@tfm4?U2%#>>3ArFo@NE(d z?nP2kqySu_j10FF{yz^}k-Xg4~5j(}^_PtaHBI$U7> z4g7{Vf;&_nxSAUY?oXBA_OuuromPXJ({bS1bT0lf-imL6dvFK9k?A@75`F`}M__Q@ z#T}fKM!>xS6_HO20vDuaViGtWT?EcXw}1>dOq>CiqBn_O!HK8~I1P<}Ud#sPpn5pD zHHn-}E+N;EJHXlJ8S*Rg7Wq5n1nxU~QOU4PS_a#lW2mX%mU9jDCiNaj=quFE;9}Dq z`X>SUt(+b~kEdtT%fSuie)<&s4SlammoA=NdUZ+dlHWzwrLoJ@E{nTt>heyP(_OA~ zxo_uS=VupfmuWZ1uHJ64-6FdUcKhs3+g-JL&{fH5H4VjpUsYF}(W!k)E%*?x=td-k8(-*Iqo2yjSp7~o)ZU>sg{*yiwo!&eT!I(BoE zIjS6oI5s)XbzJMX-|-X2J5EkcAx>#dgPaC4hX(p&!C{@MOb{w@B;{T~E`29yL$4%iy-MWB6PV&L$=g@FeHZw2`Ul-#ItTpUxPr7Gf z&yhWs_dF@XWpT0^*;3hwUU;wgUdCR_dz}iW!jr=5!&}2Yj&O`nMvRWw81a?dU7jPK zEZ-^rAu=d(P~`KGha-Pi#3^cFcKa-JInCH{IsP(nq*vV@NlT@wouXD5D;L?xvsJ(ILI z>DT1=~@{(B6jLt9yTw8jz|>ZArbN&&ocR`ug|P^=<9@ zby{FrRoa@gtID3r5z0-yQxdmOVk%L12U^K zH)h_-ipv_GwLhE6?w|d9_Qx6@jb5`}bE{uMzlr@0^>^%F)PG6;uXAKM=A1pbcy7Pk z1-YN+1?Sc0?aasWHTetjzbFVT7*+7r0D3^dfTaVzEsQFhPFk|2g122_DmQ5@>TJBYDEZ;S#%b?OhYX;pLtRDR0;44Go zhD;rDerV{>u|tmx^BPt=>}{>HR;S%wK~)T_*ii9Mm#=Hp-K*48E~~tySLt8U->6Ef zT3B`6kZO3raCLa<@E3+(t4^(6P<_3oZ_T2bn?{v!iSefq*&|kr_+@1N$h9LM*AA@R zT4z^RQMbFkTm8uTLndF-SktM7UJX+lE{#ea_2Q^o=Kkh27GxP}+12O@3(R9pVNK69 zeKoqz=%u6Yk0~9qeXL|`{n%s8vgR4hSI1?Jdv!cHUO)ce1pf)_gs&zlC$>yNlPV`2 zd?xUjDbHMCvY2(OJv);9XtHAR3zP3YJMh^(Q+%c{Q@(jF>$#0nMN`dFKc1E{ZN+qQ zx^epP88I^!&-i_2)yxlPDP}F2^>DU+_J?z#=Da-T@!a8akI##r_sV>Fe*OIO&-Z

(g4_i=7D^Y+TzL0I?Tbei#V%U$lKo3fFI{>$=jC0CgBH(U{BTLll5-}FpxIJ~@zU4Je5+TQD#*H3;o z_`54N8g4weIrV$V_sf0=`{9ir(|$a5tL)a5pUgi!zCHVn=bg28WA7fkS8(s*&vidP z_+{pO&-?3sP5kxnZv%h3`e4k%E)QRR)br7v-~0dm`Qy6BkHOZ{G`f=or*%wWr*}xv zJkDw&Y;ET3OA{vYW*(bS4IFK82a8%Kfq@CkKYt7di%nK=i+1LV% zbJD&VTZ3%_9pWAEGx`xYXg`IW1%IO#uuoxKbR9gxJwPOqfID`7@QD@zN5N#^cQgf+ zp+VqyT@U($5xh~=p;6#?y$Ov$&1fOofIb3$FIUi2&>e1o_8|BkeF(1AF>tOfg;Sip z@jl=>Jr5s15YeJk9kKMY#LMf@lHXZ#VbMYs@B&?3?aHMlqL z53bGgi88nXrzb`db>Px`lf=gpvqckc$IVMUxLfA1G z2WR6j3D~}^?gQybG=s_buojwS(d9PR4)hdTN+IWTOmMj<0%m5R>Fd!odJa98o=4B8 zpQm4-7tjkCIH-1&Mb}w$gGJx7=tma)#G>0Q_|IwXaF>`~ES$Ez_TRot-0{LP{fbb? zcmMD2U(>6EqHg}PyS^j9%K!I%ub#Y7Os^A)`QiWZ{b+i#P|mIYcK39=>rFWdg^cNl ziycDPoqyJj|L)Fo2QLrzxnh`4K)iZ_p)?$e0+VE45Ur)~A2No4Ijs=>vq3dnJ!ytT z3Z4toJG!o>jX#13-CV*u9G+5{}lWP|Eb^(c@O?S0S*75z#fh!i{O70bfaA1 zWNr>DZWdFY!jeV;0;w1LM}Xe;N9>Q=<8a;Kp`*Q{gQJI|kE5TX zzhj7F7%WY~9n&23j#C{MIJP>jc3k7Q&T)g|CdVy~+Z^9noz6Oa>vYHIXQ%s451bx3Jr;Epxr=;6 zeqiDV1cOI7ENv8E?1&MiiZVs{B7>+_)GV4TnkHH(dP%fcv`qAhXr*YgXq)JD(VL>3 zqTQnRMMp$OMaM-aVIlOT=xfns(N)oP(GAhh&V)1VZ0GFY?Bwk1?CtF1?CUIbj&N2u zM?1$kCpafL4|N{yTSH(YwZ;5Y*N@(9NlvqFY9{{BGuMOt%Hyc658M+YMOSdAek{WV#G?sc{+UQs>g(Vs>eC zneOtu%OaPTU6!~kb6M}Q&E<8MH(YkOyzTOi%K?{nVF`G`<$}uxZHBN?eeS3 z1D8iGk6n?gi>tS*uWK*YzOIF?#jd5UTGx@T4XzVhXSmLU#o`>-R@XOO54nEqddKyi z>o2aqx;}7ybAk{h}(I$ z3vQpfeeQPA?S|X;Za=#H6m z>HdTJE%)2*_uPN!j&(2XuI=93o$0=$`?l`8yI<~p-NV(x$3yB7;1T2z<&o%-?9tn! zkB8bL%R}SQ-y_$f+@s24oX2dB7d>9~SmLqF<5iFS9tS-Rd0g>Cp2408o+X|}&nC|W zo-ca7Z;Q6WNRnP05H$1=h z{LS;B=kH#amy?&Xm&D7(%Lf*|;a+ktg;$bSzE`o=2v`I^<2B1`j@LY|=e?GAt@L`; z>wwpBudlqm@w(!5)$6*~4X^LLe)Rgu>rM~4hg}c*9*#XkJ;Xh_!J^r{her>u9tk~4 zdyMO`tjEC~m%Z)0L%lP-^I-v9>|N@u^{(+A;a%%p@7>^S_HObX<2}y%S?~GYFM7Y^ zz1aH|@0H%I-mAU0dB5ZRf%g&bqu$58PkCST{>J-?_f_wk-amNX^1khT-=~XDf=`;y zK%XH#7M}?|3t=(-n$JF;!#+oRj{1D$bHe9>&!;}0`&{(7?`+G z_(uE2`o{bA^;P<+eAT{Lz8c?Z-zmOpefRqw@%_;EnC~aPpZi|){mSr zeiQu|zsY{j`Azei;kVpxgWua=6gc4buHSophy9ND9rgRj?}XpiewY2e^}FtO)9**W z+kW@_?)yFPdn9$0MoIffOQh4KOQbucN2HgfKS}RPf0I6x{_aotck%D)?+7+mng1aF zgFd(2fpfsR7U~s_DfMzf@JQpx6U`D`_fb9Wq z2J8&j9q?9Q-@xp^0f7yHV*(ciZVKET_(9-@fyV-m2c8T(9e6hIeBhP9tAW=8ZwCGt zcsuZ3;Qhegg1Q8C4RQ!_3aSbk6=Vr&3K|piLD0FNkApr5`Ybp+I4L+KI5oI$@Pgo# z!L7logVzNA8bXKIh1iEUhG;`-L!Jp?L!J$J4vZNyLS}``37Hr2e8}pMH6iOlHiT>n z*%GoX zR)?((+Yq)nY+Km&u=m4`gdGk0DC|Vosj#zQ=ff_9eHQjb*l#^Od#3i(_I$4A+MY*y zekbcH>n3xPdC0tEfwFL!T&9pk%VK5mGL2Fl98^fFR5RyI-gjBK)O znrwz_wrs9!xom^%ZP|X=yR!FXM`XujCuFB(=VTXTH)KD^Zpm)T?#h0a{VIDPd(;a9 zqm5s$KD{b?P3g6v*Rfu=!kxqA;R)f%;i=($!?VK&gcpUEgbxfa4<8&}6J8f?3O9$3 z32zRc5I!kPF^J+E;q@? z%E!wm$yxan`BeFI`Aqq2`HS*a`C9pU`6l^m^6l~+@?G-7@(<<5kkzbR4 zC;wjlqx|^1A{CJ_k@295=S1d54u~v@EQu_O92_|`QX5$rSry4f zu8ces`K`iHAy*VCMk(ei7Aux1R=~E)2E}&8n~I%^-HNvqZ!6wcoKaj*e5&|D@wMWz z;;Q1h;=bZRlwFillrxyGx<`3Nc}Mxe|Efuj%8e?BDvBzNDvufxrH!hLGDOuxjgOiX z#ej)xO4PKdnNf41=0&{_wJ_?nsFP85qurx>M-Pjh9NiMVKl(`YvFH=gr=mZN{wDg{ z=d+XCB`krBgQAjFD4)+C?+N*J|+naW&LAvV+vwQVg|+x ziWw3!GG=VdteCkm&&Mo`c`0T|%<`C(F{@(M#O#jQ8?!HFf6T#{LotVAj>H^|IUaK| z=KEO3SVe4M?AX{PvHN1bhQxHWOxx3%_*Ai|d+)lWg@JqsP2@ey=M2AF0VoqX7Vp-zg#G#2J62~NtOPrX< zBtDxsHE~AbqQsXImnJSxT#?w4xH@r7;?cybNus3Kq~fG;NzW!tO`4H3D`{cUD@iR$ zZzUZ{I-m4K(zi)JCihP6o1C7kPR>s5pPZLGAh|esVDg~kp~)4=`sCrs#^l;$Q?fa^ zDS2%2_~c2+Z1R-kX~{E_=OoWhUXZ*fd2#Zx5>wfqDYBJ8I+<=8J;pX<)xG*DLYg4r@WhTG39E?cfDPE`}CIf?%O-NcmLkc z^q$^(R__D7KkWTc@5iZjsSc@GsRgM;sn4a(O?^J~!_+gW=li(!@c|R&pg#IO!~4A6 z=dC{b`uyIvOJDoG`F+d!4(_|U@8-VS`aVb_)4HVPq?M$Vr7cT)HEmtmt+Zd$9x9c} ze#%_sLgjMhO69l8AC&q<%3el-1T`o}7%s;4SkHAcm#o>hIII;A?B z(LF<&5tuP7qdH?m##)#_|@e|4^Uu-c$DtDjR( zSI<(uRfwas{Tm*vHENEgG^CoaAtC5 zKA2XS%-NYQWbVw|m-$ZS@yyRMzs|gpc`frs=IzXTnfEgvWIoDLWcAOg%Bss63kKLp zS!~vntZ7*@vKD16&sv$aDr-&F=B#a5+q2%x+L?7JTa=xgt;+6~JurJ%wl2FWyE?l* zyCK_>Jvw`A_PA^&drtPk?3c2aWG~NNoxL`DL-wZZE!jJ>_hcW=KAwFl`)u~d*%!0F z%D$X^HT!z@?d)GQxYnSp);4Nc?G)`a?M&?)?R@P5?Mm$`?W@{#+Kt-H+O68xwCA-C zDuOHWE6OS=DvTAi6-^ZrD%gsJ6^klXRJ2yCu2@sCy<$hju8OxR_Eqe!I8t$};&{c$ ziccy&t@ym+O2z$(-zpyIFdd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/Combo Jack.xcscheme b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/Combo Jack.xcscheme new file mode 100644 index 0000000..6b159ef --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/Combo Jack.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..55e6d36 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Combo Jack.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + CB3D58421F0A7DE000F741BA + + primary + + + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..6b5623b --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ComboJack.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/saintno.xcuserdatad/xcschemes/xcschememanagement.plist b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/saintno.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f35d380 --- /dev/null +++ b/ComboJack_Source/ComboJack.xcodeproj/xcuserdata/saintno.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + ComboJack.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + CB3D58421F0A7DE000F741BA + + primary + + + + + diff --git a/ComboJack_Source/Headphone.icns b/ComboJack_Source/Headphone.icns new file mode 100644 index 0000000000000000000000000000000000000000..0e29d9d4bb0f67ab434cf574339cc7e552139099 GIT binary patch literal 204877 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 Z@L%zsi^}0&Y^kD+B5%sltM0GW{{g!w7!d#f literal 0 HcmV?d00001 diff --git a/ComboJack_Source/LICENSE b/ComboJack_Source/LICENSE new file mode 100644 index 0000000..c8ee2c2 --- /dev/null +++ b/ComboJack_Source/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + handles EAPD state updating for power-managed HDA codecs + Copyright (C) 2013 Dolnor + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ComboJack_Source/build.sh b/ComboJack_Source/build.sh new file mode 100644 index 0000000..ed40b72 --- /dev/null +++ b/ComboJack_Source/build.sh @@ -0,0 +1,13 @@ +#!/bin/bash +cd `dirname $0` + +xcodebuild -configuration Release || exit 1 +rm -f ../ComboJack_Installer/ComboJack +rm -f ../ComboJack_Installer/Headphone.icns +rm -f ../ComboJack_Installer/l10n.json +cp -f build/Release/ComboJack ../ComboJack_Installer/ +cp -f ./Headphone.icns ../ComboJack_Installer/ +cp -f ./l10n.json ../ComboJack_Installer/ +#exec ./build/Release/ComboJack +rm -rf ./build +exec bash ../ComboJack_Installer/install.sh diff --git a/ComboJack_Source/l10n.json b/ComboJack_Source/l10n.json new file mode 100644 index 0000000..2fc5550 --- /dev/null +++ b/ComboJack_Source/l10n.json @@ -0,0 +1,42 @@ +{ + "zh_CN": { + "dialogTitle" : "耳机接入通知", + "dialogMsg" : "请选择接入的设备类型(按ESC键取消)", + "btnHeadphone" : "耳机", + "btnLinein" : "线路输入", + "btnHeadset" : "耳麦", + "btnCancel" : "取消" + }, + "en_US": { + "dialogTitle" : "Combo Jack Notification", + "dialogMsg" : "What did you just plug in? (Press ESC to cancel)", + "btnHeadphone" : "Headphones", + "btnLinein" : "Line-In", + "btnHeadset" : "Headset", + "btnCancel" : "Cancel" + }, + "ru_RU": { + "dialogTitle" : "Combo Jack Notification", + "dialogMsg" : "Какое устройство было подключено? (ESC для отмены)", + "btnHeadphone" : "Наушники", + "btnLinein" : "Линейный вход", + "btnHeadset" : "Гарнитура", + "btnCancel" : "Отмена" + }, + "ru_UA": { + "dialogTitle" : "Combo Jack Notification", + "dialogMsg" : "Какое устройство было подключено? (ESC для отмены)", + "btnHeadphone" : "Наушники", + "btnLinein" : "Линейный вход", + "btnHeadset" : "Гарнитура", + "btnCancel" : "Отмена" + }, + "uk_UA": { + "dialogTitle" : "Combo Jack Notification", + "dialogMsg" : "Який пристрій було підключено? (ESC для скасування)", + "btnHeadphone" : "Навушники", + "btnLinein" : "Лінійний вхід", + "btnHeadset" : "Гарнітура", + "btnCancel" : "Скасувати" + } +} diff --git a/VerbStub_Source/LICENSE b/VerbStub_Source/LICENSE new file mode 100644 index 0000000..c8ee2c2 --- /dev/null +++ b/VerbStub_Source/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + handles EAPD state updating for power-managed HDA codecs + Copyright (C) 2013 Dolnor + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/VerbStub_Source/VerbStub.xcodeproj/project.pbxproj b/VerbStub_Source/VerbStub.xcodeproj/project.pbxproj new file mode 100644 index 0000000..49da079 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/project.pbxproj @@ -0,0 +1,435 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + CB3C1C3F1F08A6B500F26D79 /* hda-verb.c in Sources */ = {isa = PBXBuildFile; fileRef = CB3C1C3E1F08A6B500F26D79 /* hda-verb.c */; }; + CB3C1C581F0967CA00F26D79 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB3C1C561F08AA4300F26D79 /* IOKit.framework */; }; + CB3C1C5A1F0967D200F26D79 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB3C1C521F08AA3600F26D79 /* CoreFoundation.framework */; }; + CB3C1C7A1F0979D900F26D79 /* VerbStub.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CB3C1C791F0979D900F26D79 /* VerbStub.hpp */; }; + CB3C1C7C1F0979D900F26D79 /* VerbStub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB3C1C7B1F0979D900F26D79 /* VerbStub.cpp */; }; + CB3C1C831F0979E900F26D79 /* IntelHDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB3C1C811F0979E900F26D79 /* IntelHDA.cpp */; }; + CB3C1C841F0979E900F26D79 /* IntelHDA.h in Headers */ = {isa = PBXBuildFile; fileRef = CB3C1C821F0979E900F26D79 /* IntelHDA.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + CB3C1C361F08A67000F26D79 /* hda-verb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "hda-verb"; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3C1C3D1F08A6B500F26D79 /* hda_hwdep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hda_hwdep.h; sourceTree = ""; }; + CB3C1C3E1F08A6B500F26D79 /* hda-verb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "hda-verb.c"; sourceTree = ""; }; + CB3C1C521F08AA3600F26D79 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + CB3C1C541F08AA3D00F26D79 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = System/Library/Frameworks/Kernel.framework; sourceTree = SDKROOT; }; + CB3C1C561F08AA4300F26D79 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + CB3C1C771F0979D800F26D79 /* VerbStub.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VerbStub.kext; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3C1C791F0979D900F26D79 /* VerbStub.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = VerbStub.hpp; sourceTree = ""; }; + CB3C1C7B1F0979D900F26D79 /* VerbStub.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VerbStub.cpp; sourceTree = ""; }; + CB3C1C7D1F0979D900F26D79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CB3C1C811F0979E900F26D79 /* IntelHDA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntelHDA.cpp; sourceTree = ""; }; + CB3C1C821F0979E900F26D79 /* IntelHDA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntelHDA.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CB3C1C331F08A67000F26D79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CB3C1C5A1F0967D200F26D79 /* CoreFoundation.framework in Frameworks */, + CB3C1C581F0967CA00F26D79 /* IOKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB3C1C731F0979D800F26D79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CB3C1C071F08A20200F26D79 = { + isa = PBXGroup; + children = ( + CB3C1C371F08A67100F26D79 /* hda_verb */, + CB3C1C781F0979D900F26D79 /* VerbStub */, + CB3C1C121F08A20200F26D79 /* Products */, + CB3C1C511F08AA3600F26D79 /* Frameworks */, + ); + sourceTree = ""; + }; + CB3C1C121F08A20200F26D79 /* Products */ = { + isa = PBXGroup; + children = ( + CB3C1C361F08A67000F26D79 /* hda-verb */, + CB3C1C771F0979D800F26D79 /* VerbStub.kext */, + ); + name = Products; + sourceTree = ""; + }; + CB3C1C371F08A67100F26D79 /* hda_verb */ = { + isa = PBXGroup; + children = ( + CB3C1C3D1F08A6B500F26D79 /* hda_hwdep.h */, + CB3C1C3E1F08A6B500F26D79 /* hda-verb.c */, + ); + name = hda_verb; + path = "hda-verb"; + sourceTree = ""; + }; + CB3C1C511F08AA3600F26D79 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CB3C1C561F08AA4300F26D79 /* IOKit.framework */, + CB3C1C541F08AA3D00F26D79 /* Kernel.framework */, + CB3C1C521F08AA3600F26D79 /* CoreFoundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CB3C1C781F0979D900F26D79 /* VerbStub */ = { + isa = PBXGroup; + children = ( + CB3C1C811F0979E900F26D79 /* IntelHDA.cpp */, + CB3C1C821F0979E900F26D79 /* IntelHDA.h */, + CB3C1C791F0979D900F26D79 /* VerbStub.hpp */, + CB3C1C7B1F0979D900F26D79 /* VerbStub.cpp */, + CB3C1C7D1F0979D900F26D79 /* Info.plist */, + ); + path = VerbStub; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + CB3C1C741F0979D800F26D79 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CB3C1C7A1F0979D900F26D79 /* VerbStub.hpp in Headers */, + CB3C1C841F0979E900F26D79 /* IntelHDA.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + CB3C1C351F08A67000F26D79 /* hda-verb */ = { + isa = PBXNativeTarget; + buildConfigurationList = CB3C1C3A1F08A67100F26D79 /* Build configuration list for PBXNativeTarget "hda-verb" */; + buildPhases = ( + CB3C1C321F08A67000F26D79 /* Sources */, + CB3C1C331F08A67000F26D79 /* Frameworks */, + 3DF6155721AAD4BA0057F150 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "hda-verb"; + productName = "hda-verb"; + productReference = CB3C1C361F08A67000F26D79 /* hda-verb */; + productType = "com.apple.product-type.tool"; + }; + CB3C1C761F0979D800F26D79 /* VerbStub */ = { + isa = PBXNativeTarget; + buildConfigurationList = CB3C1C7E1F0979D900F26D79 /* Build configuration list for PBXNativeTarget "VerbStub" */; + buildPhases = ( + CB3C1C721F0979D800F26D79 /* Sources */, + CB3C1C731F0979D800F26D79 /* Frameworks */, + CB3C1C741F0979D800F26D79 /* Headers */, + CB3C1C751F0979D800F26D79 /* Resources */, + 3DF6155821AAD4DB0057F150 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = VerbStub; + productName = VerbStub; + productReference = CB3C1C771F0979D800F26D79 /* VerbStub.kext */; + productType = "com.apple.product-type.kernel-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CB3C1C081F08A20200F26D79 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = VerbStub; + TargetAttributes = { + CB3C1C351F08A67000F26D79 = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + CB3C1C761F0979D800F26D79 = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = CB3C1C0B1F08A20200F26D79 /* Build configuration list for PBXProject "VerbStub" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CB3C1C071F08A20200F26D79; + productRefGroup = CB3C1C121F08A20200F26D79 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CB3C1C351F08A67000F26D79 /* hda-verb */, + CB3C1C761F0979D800F26D79 /* VerbStub */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CB3C1C751F0979D800F26D79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3DF6155721AAD4BA0057F150 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\ncd \"${TARGET_BUILD_DIR}\"\ncp -f hda-verb ../../../ComboJack_Installer/\n"; + }; + 3DF6155821AAD4DB0057F150 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\ncd \"${TARGET_BUILD_DIR}\"\ncp -rf VerbStub.kext ../../../ComboJack_Installer/\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CB3C1C321F08A67000F26D79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB3C1C3F1F08A6B500F26D79 /* hda-verb.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB3C1C721F0979D800F26D79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB3C1C831F0979E900F26D79 /* IntelHDA.cpp in Sources */, + CB3C1C7C1F0979D900F26D79 /* VerbStub.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + CB3C1C171F08A20200F26D79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + CB3C1C181F08A20200F26D79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + CB3C1C3B1F08A67100F26D79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + CB3C1C3C1F08A67100F26D79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + CB3C1C7F1F0979D900F26D79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.3; + INFOPLIST_FILE = VerbStub/Info.plist; + MODULE_NAME = com.XPS.VerbStub; + MODULE_VERSION = 1.0.3; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-Wno-inconsistent-missing-override", + ); + PRODUCT_BUNDLE_IDENTIFIER = XPS.VerbStub; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = kext; + }; + name = Debug; + }; + CB3C1C801F0979D900F26D79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.3; + INFOPLIST_FILE = VerbStub/Info.plist; + MODULE_NAME = com.XPS.VerbStub; + MODULE_VERSION = 1.0.3; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-Wno-inconsistent-missing-override", + ); + PRODUCT_BUNDLE_IDENTIFIER = XPS.VerbStub; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = kext; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CB3C1C0B1F08A20200F26D79 /* Build configuration list for PBXProject "VerbStub" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB3C1C171F08A20200F26D79 /* Debug */, + CB3C1C181F08A20200F26D79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CB3C1C3A1F08A67100F26D79 /* Build configuration list for PBXNativeTarget "hda-verb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB3C1C3B1F08A67100F26D79 /* Debug */, + CB3C1C3C1F08A67100F26D79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CB3C1C7E1F0979D900F26D79 /* Build configuration list for PBXNativeTarget "VerbStub" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB3C1C7F1F0979D900F26D79 /* Debug */, + CB3C1C801F0979D900F26D79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CB3C1C081F08A20200F26D79 /* Project object */; +} diff --git a/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f05e032 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/karl.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..f2a10ad03f957bbb5aa88da4bfee797a7ced6c05 GIT binary patch literal 108573 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 literal 0 HcmV?d00001 diff --git a/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate b/VerbStub_Source/VerbStub.xcodeproj/project.xcworkspace/xcuserdata/ling.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..28b1ef0f48ea5bcc53f62a2f576684c572f342ad GIT binary patch literal 10836 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 literal 0 HcmV?d00001 diff --git a/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/VerbStub.xcscheme b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/VerbStub.xcscheme new file mode 100644 index 0000000..2a9d2b7 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/VerbStub.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/hda-verb.xcscheme b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/hda-verb.xcscheme new file mode 100644 index 0000000..62f13a3 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/hda-verb.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..2af3065 --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/karl.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,47 @@ + + + + + SchemeUserState + + VerbStub.xcscheme + + orderHint + 0 + + hda-verb.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + CB3C1C101F08A20200F26D79 + + primary + + + CB3C1C2A1F08A5D200F26D79 + + primary + + + CB3C1C351F08A67000F26D79 + + primary + + + CB3C1C441F08A73100F26D79 + + primary + + + CB3C1C761F0979D800F26D79 + + primary + + + + + diff --git a/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..56ea01b --- /dev/null +++ b/VerbStub_Source/VerbStub.xcodeproj/xcuserdata/ling.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + VerbStub.xcscheme_^#shared#^_ + + orderHint + 1 + + hda-verb.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/VerbStub_Source/VerbStub/Info.plist b/VerbStub_Source/VerbStub/Info.plist new file mode 100644 index 0000000..df5a92f --- /dev/null +++ b/VerbStub_Source/VerbStub/Info.plist @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + ${MODULE_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + KEXT + CFBundleShortVersionString + ${MODULE_VERSION} + CFBundleVersion + ${MODULE_VERSION} + IOKitPersonalities + + VerbStubResidency + + CFBundleIdentifier + ${MODULE_NAME} + IOClass + VerbStubResidency + IOMatchCategory + VerbStubResidency + IOProviderClass + IOResources + + VerbStub + + CFBundleIdentifier + ${MODULE_NAME} + IOClass + com_XPS_VerbStub + IOProviderClass + IOHDACodecFunction + IOMatchCategory + com_XPS_VerbStub + IOUserClientClass + VerbStubUserClient + + + NSHumanReadableCopyright + Copyright © 2017 VerbStub. All rights reserved. + OSBundleLibraries + + com.apple.iokit.IOPCIFamily + 2.9 + com.apple.kpi.iokit + 16.6 + com.apple.kpi.libkern + 16.6 + + + diff --git a/VerbStub_Source/VerbStub/IntelHDA.cpp b/VerbStub_Source/VerbStub/IntelHDA.cpp new file mode 100644 index 0000000..7493ac0 --- /dev/null +++ b/VerbStub_Source/VerbStub/IntelHDA.cpp @@ -0,0 +1,429 @@ +/* + * Released under "The GNU General Public License (GPL-2.0)" + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// +// Adapted from CodecCommander: +// https://github.com/Dolnor/EAPD-Codec-Commander +// + +#include "IntelHDA.h" + +#define kIntelVendorID 0x8086 +#define kIntelRegTCSEL 0x44 + +static IOPCIDevice* getPCIDevice(IORegistryEntry* registryEntry) +{ + IOPCIDevice* result = NULL; + while (registryEntry) + { + result = OSDynamicCast(IOPCIDevice, registryEntry); + if (result) + break; + registryEntry = registryEntry->getParentEntry(gIOServicePlane); + } + return result; +} + +static UInt32 getPropertyValue(IORegistryEntry* registryEntry, const char* propertyName) +{ + UInt32 result = -1; + while (registryEntry) + { + if (OSNumber* value = OSDynamicCast(OSNumber, registryEntry->getProperty(propertyName))) + { + result = value->unsigned32BitValue(); + break; + } + registryEntry = registryEntry->getParentEntry(gIOServicePlane); + } + return result; +} + +IntelHDA::IntelHDA(IOService* provider, HDACommandMode commandMode) +{ + mCommandMode = commandMode; + mDevice = getPCIDevice(provider); + + mCodecVendorId = getPropertyValue(provider, kCodecVendorID); + mCodecGroupType = getPropertyValue(provider, kCodecFuncGroupType); + mCodecAddress = getPropertyValue(provider, kCodecAddress); + mCodecSubsystemId = getPropertyValue(provider, kCodecSubsystemID); + mCodecRevisionId = getPropertyValue(provider, kCodecRevisionID); + + // defaults for VoodooHDA... + if (0xFF == mCodecGroupType) mCodecGroupType = 1; + if (0xFF == mCodecAddress) mCodecAddress = 0; +} + +IntelHDA::~IntelHDA() +{ + OSSafeReleaseNULL(mMemoryMap); +} + +bool IntelHDA::initialize() +{ + DebugLog("IntelHDA::initialize\n"); + + if (mDevice == NULL) + { + AlwaysLog("mDevice is NULL in IntelHDA::initialize\n"); + return false; + } + if (mDevice->getDeviceMemoryCount() == 0) + { + AlwaysLog("getDeviceMemoryCount returned 0 in IntelHDA::initialize\n"); + return false; + } + if (mCodecAddress == 0xFF) + { + AlwaysLog("mCodecAddress is 0xFF in IntelHDA::initialize\n"); + return false; + } + if (mCodecGroupType != HDA_TYPE_AFG) + { + DebugLog("mCodecGroupType is %d (must be 1) in IntelHDA::initialize\n", mCodecGroupType); + return false; + } + + mDevice->setMemoryEnable(true); + + mDeviceMemory = mDevice->getDeviceMemoryWithIndex(0); + + if (mDeviceMemory == NULL) + { + AlwaysLog("Failed to access device memory.\n"); + return false; + } + + DebugLog("Device memory @ 0x%08llx, size 0x%08llx\n", mDeviceMemory->getPhysicalAddress(), mDeviceMemory->getLength()); + + mMemoryMap = mDeviceMemory->map(); + + if (mMemoryMap == NULL) + { + AlwaysLog("Failed to map device memory.\n"); + return false; + } + + DebugLog("Memory mapped at @ 0x%08llx\n", mMemoryMap->getVirtualAddress()); + + mRegMap = (pHDA_REG)mMemoryMap->getVirtualAddress(); + + char devicePath[1024]; + int pathLen = sizeof(devicePath); + bzero(devicePath, sizeof(devicePath)); + + uint32_t deviceInfo = mDevice->configRead32(0); + + if (mDevice->getPath(devicePath, &pathLen, gIOServicePlane)) + AlwaysLog("Evaluating device \"%s\" [%04x:%04x].\n", + devicePath, + deviceInfo & 0xFFFF, + deviceInfo >> 16); + + // Note: Must reset the codec here for getVendorId to work. + // If the computer is restarted when the codec is in fugue state (D3cold), + // it will not respond without the Double Function Group Reset. + if (mCodecVendorId == -1 && this->getVendorId() == 0xFFFF) + this->resetCodec(); + + if (mRegMap->VMAJ == 1 && mRegMap->VMIN == 0 && this->getVendorId() != 0xFFFF) + { + UInt16 vendor = this->getVendorId(); + UInt16 device = this->getDeviceId(); + UInt32 subsystem = this->getSubsystemId(); + UInt32 revision = this->getRevisionId(); + + if (mCodecVendorId == (UInt32)-1) + mCodecVendorId = (UInt32)vendor << 16 | device; + + // avoid logging HDMI audio (except in DEBUG build) as it is disabled anyway +#ifndef DEBUG + if (vendor != 0x8086) +#endif + { + AlwaysLog("....Codec Vendor ID: 0x%08x\n", mCodecVendorId); + AlwaysLog("....Codec Address: %d\n", mCodecAddress); + AlwaysLog("....Subsystem ID: 0x%08x\n", subsystem); + AlwaysLog("....Revision ID: 0x%08x\n", revision); + AlwaysLog("....PCI Sub ID: 0x%08x\n", getPCISubId()); + DebugLog("....Output Streams: %d\n", mRegMap->GCAP_OSS); + DebugLog("....Input Streams: %d\n", mRegMap->GCAP_ISS); + DebugLog("....Bidi Streams: %d\n", mRegMap->GCAP_BSS); + DebugLog("....Serial Data: %d\n", mRegMap->GCAP_NSDO); + DebugLog("....x64 Support: %d\n", mRegMap->GCAP_64OK); + DebugLog("....Codec Version: %d.%d\n", mRegMap->VMAJ, mRegMap->VMIN); + DebugLog("....Vendor ID: 0x%04x\n", vendor); + DebugLog("....Device ID: 0x%04x\n", device); + } + + return true; + } + + return false; +} + +void IntelHDA::resetCodec() +{ + /* + Reset is created by sending two Function Group resets, potentially separated + by an undefined number of idle frames, but no other valid commands. + This Function Group “Double” reset shall do a full initialization and reset + most settings to their power on defaults. + */ + + DebugLog("--> resetting codec\n"); + + UInt16 audioRoot = getAudioRoot(); + this->sendCommand(audioRoot, HDA_VERB_RESET, HDA_PARM_NULL); + IOSleep(1); + this->sendCommand(audioRoot, HDA_VERB_RESET, HDA_PARM_NULL); + IOSleep(220); // per-HDA spec, device must respond (D0) within 200ms + + // forcefully set power state to D3 + this->sendCommand(audioRoot, HDA_VERB_SET_PSTATE, HDA_PARM_PS_D3_HOT); + DebugLog("--> hda codec power restored\n"); +} + +void IntelHDA::applyIntelTCSEL() +{ + if (mDevice && mDevice->configRead16(kIOPCIConfigVendorID) == kIntelVendorID) + { + /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) + * TCSEL == Traffic Class Select Register, which sets PCI express QOS + * Ensuring these bits are 0 clears playback static on some HD Audio + * codecs. + * The PCI register TCSEL is defined in the Intel manuals. + */ + UInt8 value = mDevice->configRead8(kIntelRegTCSEL); + UInt8 newValue = value & ~0x07; + if (newValue != value) + { + mDevice->configWrite8(kIntelRegTCSEL, newValue); + DebugLog("Intel TCSEL: 0x%02x -> 0x%02x\n", value, newValue); + } + } +} + +UInt16 IntelHDA::getVendorId() +{ + if (mCodecVendorId == -1) + mCodecVendorId = this->sendCommand(0, HDA_VERB_GET_PARAM, HDA_PARM_VENDOR); + + return mCodecVendorId >> 16; +} + +UInt16 IntelHDA::getDeviceId() +{ + if (mCodecVendorId == -1) + mCodecVendorId = this->sendCommand(0, HDA_VERB_GET_PARAM, HDA_PARM_VENDOR); + + return mCodecVendorId & 0xFFFF; +} + +UInt16 IntelHDA::getAudioRoot() +{ + if (mAudioRoot == (UInt16)-1) + { + UInt32 nodes = this->sendCommand(0, HDA_VERB_GET_PARAM, HDA_PARM_NODECOUNT); + if (nodes != -1) + { + UInt16 start = nodes & 0xFF; + UInt16 end = start + ((nodes & 0xFF0000) >> 16); + for (UInt16 node = start; node < end; node++) + { + UInt32 type = this->sendCommand(node, HDA_VERB_GET_PARAM, HDA_PARM_FUNCGRP); + if ((type & 0xFF) == HDA_TYPE_AFG) + { + DebugLog("getAudioRoot found audio root = 0x%02x\n", node); + mAudioRoot = node; + break; + } + } + } + if (mAudioRoot == (UInt16)-1) + { + DebugLog("getAudioRoot failed to find audio root... using default root of 1\n"); + mAudioRoot = 1; + } + } + return mAudioRoot; +} + +UInt8 IntelHDA::getTotalNodes() +{ + if (mNodes == -1) + { + UInt16 audioRoot = getAudioRoot(); + mNodes = this->sendCommand(audioRoot, HDA_VERB_GET_PARAM, HDA_PARM_NODECOUNT); + // in the case of an invalid response, use zero + if (mNodes == -1) mNodes = 0; + } + return mNodes & 0x0000FF; +} + +UInt8 IntelHDA::getStartingNode() +{ + if (mNodes == -1) + { + UInt16 audioRoot = getAudioRoot(); + mNodes = this->sendCommand(audioRoot, HDA_VERB_GET_PARAM, HDA_PARM_NODECOUNT); + // in the case of an invalid response, use zero + if (mNodes == -1) mNodes = 0; + } + return (mNodes & 0xFF0000) >> 16; +} + +UInt32 IntelHDA::getSubsystemId() +{ + if (mCodecSubsystemId == -1) + { + UInt16 audioRoot = getAudioRoot(); + mCodecSubsystemId = this->sendCommand(audioRoot, HDA_VERB_GET_SUBSYSTEM_ID, HDA_PARM_NULL); + // in the case of an invalid response, use zero + if (mCodecSubsystemId == -1) mCodecSubsystemId = 0; + } + return mCodecSubsystemId; +} + +UInt32 IntelHDA::getPCISubId() +{ + UInt32 result = mDevice->configRead32(kIOPCIConfigSubSystemVendorID); + // flip words to be consistent with other 32-bit identifiers + return ((result & 0xFFFF) << 16) | result >> 16; +} + +UInt32 IntelHDA::getRevisionId() +{ + if (mCodecRevisionId == -1) + { + UInt16 audioRoot = getAudioRoot(); + mCodecRevisionId = this->sendCommand(audioRoot, HDA_VERB_GET_PARAM, HDA_PARM_REVISION); + // in the case of an invalid response, use zero + if (mCodecRevisionId == -1) mCodecRevisionId = 0; + } + return mCodecRevisionId; +} + +UInt32 IntelHDA::sendCommand(UInt8 nodeId, UInt16 verb, UInt8 payload) +{ + DebugLog("SendCommand: node 0x%02x, verb 0x%06x, payload 0x%02x.\n", nodeId, verb, payload); + return this->sendCommand((nodeId & 0xFF) << 20 | (verb & 0xFFF) << 8 | payload); +} + +UInt32 IntelHDA::sendCommand(UInt8 nodeId, UInt8 verb, UInt16 payload) +{ + DebugLog("SendCommand: node 0x%02x, verb 0x%02x, payload 0x%04x.\n", nodeId, verb, payload); + return this->sendCommand((nodeId & 0xFF) << 20 | (verb & 0xF) << 16 | payload); +} + +UInt32 IntelHDA::sendCommand(UInt32 command) +{ + UInt32 fullCommand = (mCodecAddress & 0xF) << 28 | (command & 0x0FFFFFFF); + + if (mDeviceMemory == NULL) + return -1; + + DebugLog("SendCommand: (w) --> 0x%08x\n", fullCommand); + + UInt32 response = -1; + + switch (mCommandMode) + { + case PIO: + response = this->executePIO(fullCommand); + break; + case DMA: + AlwaysLog("Unsupported command mode DMA requested.\n"); + response = -1; + break; + default: + response = -1; + break; + } + + DebugLog("SendCommand: (r) <-- 0x%08x\n", response); + + return response; +} + +UInt32 IntelHDA::executePIO(UInt32 command) +{ + UInt16 status; + + status = 0x1; // Busy status + + for (int i = 0; i < 1000; i++) + { + status = mRegMap->ICS; + + if (!HDA_ICS_IS_BUSY(status)) + break; + + ::IODelay(100); + } + + // HDA controller was not ready to receive PIO commands + if (HDA_ICS_IS_BUSY(status)) + { + DebugLog("ExecutePIO timed out waiting for ICS readiness.\n"); + return -1; + } + + //DEBUG_LOG("IntelHDA::ExecutePIO ICB bit clear.\n"); + + // Queue the verb for the HDA controller + mRegMap->ICW = command; + + status = 0x1; // Busy status + mRegMap->ICS = status; + + //DEBUG_LOG("IntelHDA::ExecutePIO Wrote verb and set ICB bit.\n"); + + // Wait for HDA controller to return with a response + for (int i = 0; i < 1000; i++) + { + status = mRegMap->ICS; + + if (!HDA_ICS_IS_BUSY(status)) + break; + + ::IODelay(100); + } + + // Store the result validity while IRV is cleared + bool validResult = HDA_ICS_IS_VALID(status); + + UInt32 response = 0xdeadbeef; //Obvious indication that something weird occurred + + if (validResult) + response = mRegMap->IRR; + + // Reset IRV + status = 0x02; // Valid, Non-busy status + mRegMap->ICS = status; + + if (!validResult) + { + DebugLog("ExecutePIO Invalid result received.\n"); + return -1; + } + + return response; +} diff --git a/VerbStub_Source/VerbStub/IntelHDA.h b/VerbStub_Source/VerbStub/IntelHDA.h new file mode 100644 index 0000000..947e90c --- /dev/null +++ b/VerbStub_Source/VerbStub/IntelHDA.h @@ -0,0 +1,318 @@ +/* + * Released under "The GNU General Public License (GPL-2.0)" + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// +// Adapted from CodecCommander: +// https://github.com/Dolnor/EAPD-Codec-Commander +// + +#ifndef CodecCommander_IntelHDA_h +#define CodecCommander_IntelHDA_h + +#include + +#ifdef DEBUG +# define DebugLog(args...) do { IOLog("VerbStub: " args); } while (0) +#else +# define DebugLog(args...) +#endif + +#define AlwaysLog(args...) do { IOLog("VerbStub: " args); } while (0) + +#define kCodecProfile "Codec Profile" +#define kCodecVendorID "IOHDACodecVendorID" +#define kCodecAddress "IOHDACodecAddress" +#define kCodecRevisionID "IOHDACodecRevisionID" +#define kCodecFuncGroupType "IOHDACodecFunctionGroupType" +#define kCodecSubsystemID "IOHDACodecFunctionSubsystemID" + +// Intel HDA Verbs +#define HDA_VERB_GET_PARAM (UInt16)0xF00 // Get Parameter +#define HDA_VERB_SET_PSTATE (UInt16)0x705 // Set Power State +#define HDA_VERB_GET_PSTATE (UInt16)0xF05 // Get Power State +#define HDA_VERB_EAPDBTL_GET (UInt16)0xF0C // EAPD/BTL Enable Get +#define HDA_VERB_EAPDBTL_SET (UInt16)0x70C // EAPD/BTL Enable Set +#define HDA_VERB_RESET (UInt16)0x7FF // Function Reset Execute +#define HDA_VERB_GET_SUBSYSTEM_ID (UInt16)0xF20 // Get codec subsystem ID + +#define HDA_VERB_SET_AMP_GAIN (UInt8)0x3 // Set Amp Gain / Mute +#define HDA_VERB_GET_AMP_GAIN (Uint8)0xB // Get Amp Gain / Mute + +#define HDA_PARM_NULL (UInt8)0x00 // Empty or NULL payload + +#define HDA_PARM_VENDOR (UInt8)0x00 // Vendor ID +#define HDA_PARM_REVISION (UInt8)0x02 // Revision ID +#define HDA_PARM_NODECOUNT (UInt8)0x04 // Subordinate Node Count +#define HDA_PARM_FUNCGRP (UInt8)0x05 // Function Group Type +#define HDA_PARM_PINCAP (UInt8)0x0C // Pin Capabilities +#define HDA_PARM_PWRSTS (UInt8)0x0F // Supported Power States + +#define HDA_PARM_PS_D0 (UInt8)0x00 // Powerstate D0: Fully on +#define HDA_PARM_PS_D1 (UInt8)0x01 // Powerstate D1 +#define HDA_PARM_PS_D2 (UInt8)0x02 // Powerstate D2 +#define HDA_PARM_PS_D3_HOT (UInt8)0x03 // Powerstate D3Hot +#define HDA_PARM_PS_D3_COLD (UInt8)0x04 // Powerstate D3Cold + +#define HDA_TYPE_AFG 1 // return from PARM_FUNCGRP is 1 for Audio + +// Dynamic payload parameters +#define HDA_PARM_AMP_GAIN_GET(Index, Left, Output) \ + (UInt16)((Output & 0x1) << 15 | (Left & 0x01) << 13 | Index & 0xF) // Get Amp gain / mute + +#define HDA_PARM_AMP_GAIN_SET(Gain, Mute, Index, SetRight, SetLeft, SetInput, SetOutput) \ + (UInt16)((SetOutput & 0x01) << 15 | (SetInput & 0x01) << 14 | (SetLeft & 0x01) << 13 | (SetRight & 0x01) << 12 | \ + (Index & 0xF) << 8 | (Mute & 0x1) << 7 | Gain & 0x7F) // Set Amp gain / mute + +// Determine Immediate Command Busy (ICB) of Immediate Command Status (ICS) +#define HDA_ICS_IS_BUSY(status) ((status) & (1<<0)) + +// Determine Immediate Result Valid (IRV) of Immediate Command Status (ICS) +#define HDA_ICS_IS_VALID(status) ((status) & (1<<1)) + +// Determine if this Pin widget capabilities is marked EAPD capable +#define HDA_PINCAP_IS_EAPD_CAPABLE(capabilities) ((capabilities) & (1<<16)) + +typedef struct __attribute__((packed)) +{ + // 00h: GCAP – Global Capabilities + volatile UInt16 GCAP_OSS : 4; // Number of Output Streams Supported + volatile UInt16 GCAP_ISS : 4; // Number of Input Streams Supported + volatile UInt16 GCAP_BSS : 5; // Number of Bidirectional Streams Supported + volatile UInt16 GCAP_NSDO : 2; // Number of Serial Data Out Signals + volatile UInt16 GCAP_64OK : 1; // 64 Bit Address Supported + // 02h: VMIN – Minor Version + volatile UInt8 VMIN; // Minor Version + // 03h: VMAJ – Major Version + volatile UInt8 VMAJ; // Major Version + // 04h: OUTPAY – Output Payload Capability + volatile UInt16 OUTPAY; // Output Payload Capability + // 06h: INPAY – Input Payload Capability + volatile UInt16 INPAY; // Input Payload Capability + // 08h: GCTL – Global Control + UInt32 : 23; // Reserved + volatile UInt32 GCTL_UNSOL : 1; // Accept Unsolicited Response Enable + UInt32 : 6; // Reserved + volatile UInt32 GCTL_FCNTRL : 1; // Flush Control + volatile UInt32 GCTL_CRST : 1; // Controller Reset + // 0Ch: WAKEEN – Wake Enable + UInt16 : 1; // Reserved + volatile UInt16 WAKEEN_SDIWEN : 15; // SDIN Wake Enable Flags + // 0Eh: STATESTS – State Change Status + UInt16 : 1; // Reserved + volatile UInt16 STATESTS_SDIWAKE: 15; // SDIN State Change Status Flags + // 10h: GSTS – Global Status + UInt16 : 14; // Reserved + volatile UInt16 GSTS_FSTS : 1; // Flush Status + UInt16 : 1; // Reserved + + UInt32 : 32; // Spacer + UInt16 : 16; // Spacer + + // 18h: OUTSTRMPAY – Output Stream Payload Capability + volatile UInt16 OUTSTRMPAY; // Output Stream Payload Capability + // 1Ah: INSTRMPAY – Input Stream Payload Capability + volatile UInt16 INSTRMPAY; // Input Stream Payload Capability + + UInt32 : 32; // Spacer + + // 20h: INTCTL – Interrupt Control + volatile UInt32 INTCTL_GIE : 1; // Global Interrupt Enable + volatile UInt32 INTCTL_CIE : 1; // Controller Interrupt Enable + volatile UInt32 INTCTL_SIE : 30; // Stream Interrupt Enable + // 24h: INTSTS – Interrupt Status + volatile UInt32 INTSTS_GIS : 1; // Global Interrupt Status + volatile UInt32 INTSTS_CIS : 1; // Controller Interrupt Status + volatile UInt32 INTSTS_SIS : 30; // Stream Interrupt Status + + UInt32 : 32; // Spacer + UInt32 : 32; // Spacer + + // 30h: Wall Clock Counter + volatile UInt32 WALL_CLOCK_COUNTER; // Wall Clock Counter + UInt32 : 32; // Spacer + // 38h: SSYNC – Stream Synchronization + UInt32 : 2; // Reserved + volatile UInt32 SSYNC : 30; // Stream Synchronization Bits + + UInt32 : 32; // Spacer + + // 40h: CORB Lower Base Address + volatile UInt32 CORBLBASE; // CORB Lower Base Address + // 44h: CORB Upper Base Address + volatile UInt32 CORBUBASE; // CORB Upper Base Address + // 48h: CORBWP – CORB Write Pointer + UInt16 : 8; // Reserved + volatile UInt16 CORBWP : 8; // CORB Write Pointer + // 4Ah: CORBRP – CORB Read Pointer + volatile UInt16 CORBRPRST : 1; // CORB Read Pointer Reset + UInt16 : 7; // Reserved + volatile UInt16 CORBRP : 8; // CORB Read Pointer + // 4Ch: CORBCTL – CORB Control + UInt8 : 6; // Reserved + volatile UInt8 CORBRUN : 1; // Enable CORB DMA Engine + volatile UInt8 CMEIE : 1; // CORB Memory Error Interrupt Enable + // 4Dh: CORBSTS – CORB Status + UInt8 : 7; // Reserved + volatile UInt8 CMEI : 1; // CORB Memory Error Indication + // 4Eh: CORBSIZE – CORB Size + volatile UInt8 CORBSZCAP : 4; // CORB Size Capability + UInt8 : 2; // Reserved + volatile UInt8 CORBSIZE : 2; // CORB Size + + UInt8 : 8; // Spacer + + // 50h: RIRBLBASE – RIRB Lower Base Address + volatile UInt32 RIRBLBASE; // RIRB Lower Base Address + // 54h: RIRBUBASE – RIRB Upper Base Address + volatile UInt32 RIRBUBASE; // RIRB Upper Base Address + // 58h: RIRBWP – RIRB Write Pointer + volatile UInt16 RIRBWPRST : 1; // RIRB Write Pointer Reset + UInt16 : 7; // Reserved + volatile UInt16 RIRBWP : 8; // RIRB Write Pointer + // 5Ah: RINTCNT – Response Interrupt Count + UInt16 : 8; + volatile UInt16 RINTCNT : 8; // N Response Interrupt Count + // 5Ch: RIRBCTL – RIRB Control + UInt8 : 5; // Reserved + volatile UInt8 RINTCNT_RIRBOIC : 1; // Response Overrun Interrupt Control + volatile UInt8 RINTCNT_RIRBDMAEN: 1; // RIRB DMA Enable + volatile UInt8 RINTCNT_RINTCTL : 1; // Response Interrupt Control + // 5Dh: RIRBSTS – RIRB Status + UInt8 : 5; // Reserved + volatile UInt8 RIRBSTS_RIRBOIS : 1; // Response Overrun Interrupt Status + UInt8 : 1; // Reserved + volatile UInt8 RIRBSTS_RINTFL : 1; // Response Interrupt + // 5Eh: RIRBSIZE – RIRB Size + volatile UInt8 RIRBSIZE_RIRBSZCAP: 4; // RIRB Size Capability + UInt8 : 2; // Reserved + volatile UInt8 RIRBSIZE : 2; // RIRB Size + + UInt8 : 8; // Spacer + + // 60h: Immediate Command Output Interface + volatile UInt32 ICW; // Immediate Command Write + // 64h: Immediate Response Input Interface + volatile UInt32 IRR; // Immediate Response Read + // 68h: Immediate Command Status + union + { + volatile UInt16 ICS; // Immediate Command Status + UInt16 : 8; // Reserved + volatile UInt16 ICS_IRRADD : 4; // Immediate Response Result Address + volatile UInt16 ICS_IRRUNSOL : 1; // Immediate Response Result Unsolicited + volatile UInt16 ICS_ICV : 1; // Immediate Command Version + volatile UInt16 ICS_IRV : 1; // Immediate Result Valid + volatile UInt16 ICS_ICB : 1; // Immediate Command Busy + }; + + UInt32 : 32; // Spacer + UInt16 : 16; // Spacer + + // 70h: DPLBASE – DMA Position Lower Base Address + volatile UInt32 DPLBASE_ADDR : 25; // DMA Position Lower Base Address + UInt32 : 6; + volatile UInt32 DPLBASE_ENBL : 1; // DMA Position Buffer Enable + // 74h: DPUBASE – DMA Position Upper Base Address + volatile UInt32 DPUBASE; // DMA Position Upper Base Address +} HDA_REG, *pHDA_REG; + +// Global Capabilities response +struct HDA_GCAP +{ + UInt16 NumOutputStreamsSupported : 4; + UInt16 NumInputStreamsSupported : 4; + UInt16 NumBidirectionalStreamsSupported : 5; + UInt16 NumSerialDataOutSignals : 2; + UInt16 Supports64bits : 1; +}; + +// Global Capabilities & HDA Version response +struct HDA_GCAP_EXT : HDA_GCAP +{ + UInt8 MinorVersion; + UInt8 MajorVersion; +}; + +enum HDACommandMode +{ + PIO, + DMA +}; + +class IntelHDA +{ + IOPCIDevice* mDevice = NULL; + IODeviceMemory* mDeviceMemory = NULL; + IOMemoryMap* mMemoryMap = NULL; + + pHDA_REG mRegMap = NULL; + + // Initialized in constructor + HDACommandMode mCommandMode; + UInt32 mCodecVendorId; + UInt32 mCodecSubsystemId; + UInt32 mCodecRevisionId; + UInt8 mCodecGroupType; + UInt8 mCodecAddress; + + // Read-once parameters + UInt32 mNodes = -1; + UInt16 mAudioRoot = -1; + +public: + // Constructor + IntelHDA(IOService *provider, HDACommandMode commandMode); + // Destructor + ~IntelHDA(); + + bool initialize(); + + void applyIntelTCSEL(); + + // 12-bit verb and 8-bit payload + UInt32 sendCommand(UInt8 nodeId, UInt16 verb, UInt8 payload); + // 4-bit verb and 16-bit payload + UInt32 sendCommand(UInt8 nodeId, UInt8 verb, UInt16 payload); + + // Send a raw command (verb and payload combined) + UInt32 sendCommand(UInt32 command); + + void resetCodec(); + + UInt32 getCodecVendorId() { return mCodecVendorId; } + UInt8 getCodecAddress() { return mCodecAddress; } + UInt8 getCodecGroupType() { return mCodecGroupType; } + UInt32 getCodecSubsystemId() { return mCodecSubsystemId; } + UInt32 getCodecRevisionId() { return mCodecRevisionId; } + + UInt16 getVendorId(); + UInt16 getDeviceId(); + UInt32 getPCISubId(); + UInt32 getSubsystemId(); + UInt32 getRevisionId(); + + UInt8 getTotalNodes(); + UInt8 getStartingNode(); + +private: + UInt32 executePIO(UInt32 command); + UInt16 getAudioRoot(); +}; + +#endif diff --git a/VerbStub_Source/VerbStub/VerbStub.cpp b/VerbStub_Source/VerbStub/VerbStub.cpp new file mode 100644 index 0000000..3422ab8 --- /dev/null +++ b/VerbStub_Source/VerbStub/VerbStub.cpp @@ -0,0 +1,315 @@ +/* + * Released under "The GNU General Public License (GPL-2.0)" + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// +// Adapted from CodecCommander: +// https://github.com/Dolnor/EAPD-Codec-Commander +// +// Apple Driver Documentation +// +// Writing a kernel extension: +// https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIOKit/iokit_tutorial.html +// IOKit Fundamentals: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html +// Writing an IOKit driver: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/WritingDeviceDriver/Introduction/Intro.html +// Accessing Hardware: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/AccessingHardware/AH_Intro/AH_Intro.html +// User Client Info (sample user client driver interface): +// https://developer.apple.com/library/content/samplecode/SimpleUserClient/Listings/User_Client_Info_txt.html +// + +#include +#include "VerbStub.hpp" + +//********************************************************************* +// VerbStub Main Kernel Driver: +//********************************************************************* + +// This required macro defines the class's constructors, destructors, +// and several other methods I/O Kit requires. +OSDefineMetaClassAndStructors(com_XPS_VerbStub, IOService) + +// Define the driver's superclass. +#define super IOService + +// +// IOKit driver init override (for logging) +// + +bool com_XPS_VerbStub::init(OSDictionary *dict) +{ + bool result = super::init(dict); + IOLog("Initializing...\n"); + return result; +} + +// +// IOkit driver free override (for logging) +// + +void com_XPS_VerbStub::free(void) +{ + IOLog("Freeing...\n"); + super::free(); +} + +// +// IOkit driver probe override (for logging) +// + +IOService *com_XPS_VerbStub::probe(IOService *provider, + SInt32 *score) +{ + IOService *result = super::probe(provider, score); + IOLog("Probing...\n"); + return result; +} + +// This function only gets used by 'start' to set IORegistry properties +static void setNumberProperty(IOService* service, const char* key, UInt32 value) +{ + OSNumber* num = OSNumber::withNumber(value, 32); + if (num) + { + service->setProperty(key, num); + num->release(); + } +} + +// +// IOkit driver start override +// + +bool com_XPS_VerbStub::start(IOService *provider) +{ + bool result = super::start(provider); + IOLog("Starting...\n"); + if (!result) + { + IOLog("Error starting driver.\n"); + return result; + } + + // cache the provider + AudioDevc = provider; + + HDADevice = new IntelHDA(provider, PIO); + if (!HDADevice || !HDADevice->initialize()) + { + IOLog("Error initializing HDADevice instance.\n"); + stop(provider); + return false; + } + + // Populate HDA properties in IORegistry + setNumberProperty(this, kCodecVendorID, HDADevice->getCodecVendorId()); + setNumberProperty(this, kCodecAddress, HDADevice->getCodecAddress()); + setNumberProperty(this, kCodecFuncGroupType, HDADevice->getCodecGroupType()); + setNumberProperty(this, kCodecSubsystemID, HDADevice->getCodecSubsystemId()); + setNumberProperty(this, kCodecRevisionID, HDADevice->getCodecRevisionId()); + + this->registerService(0); + return result; +} + +// +// IOkit driver stop override +// + +void com_XPS_VerbStub::stop(IOService *provider) +{ + IOLog("Stopping...\n"); + + // Free HDADevice + delete HDADevice; + HDADevice = NULL; + + AudioDevc = NULL; + + super::stop(provider); +} + +// +// Execute external command from user client +// + +UInt32 com_XPS_VerbStub::ExternalCommand(UInt32 command) +{ + if (HDADevice) + { + UInt32 response; + response = HDADevice->sendCommand(command); + return response; + } + return -1; +} + +//********************************************************************* +// VerbStub Userspace Client: +//********************************************************************* + +// +// This should match IOConnectCallScalarMethod in hda-verb.c because this +// is the link to user-space. +// + +const IOExternalMethodDispatch VerbStubUserClient::sMethods[kClientNumMethods] = +{ + { // kClientExecuteVerb + (IOExternalMethodAction)&VerbStubUserClient::executeVerb, + 1, // One scalar input value + 0, // No struct inputs + 1, // One scalar output value + 0 // No struct outputs + } +}; + +// Structure of IOExternalMethodDispatch: +// https://developer.apple.com/library/content/samplecode/SimpleUserClient/Listings/User_Client_Info_txt.html +/* + struct IOExternalMethodDispatch + { + IOExternalMethodAction function; + uint32_t checkScalarInputCount; + uint32_t checkStructureInputSize; + uint32_t checkScalarOutputCount; + uint32_t checkStructureOutputSize; + }; +*/ + +/* + * Define the metaclass information that is used for runtime + * typechecking of IOKit objects. We're a subclass of IOUserClient. + */ + +OSDefineMetaClassAndStructors(VerbStubUserClient, IOUserClient) + +// +// IOUserClient user-kernel boundary interface init (initWithTask) +// + +bool VerbStubUserClient::initWithTask(task_t owningTask, void* securityID, UInt32 type, OSDictionary* properties) +{ + IOLog("Client::initWithTask(type %u)\n", (unsigned int)type); + + mTask = owningTask; + + return IOUserClient::initWithTask(owningTask, securityID, type, properties); +} + +// +// IOUserClient user-kernel boundary interface start +// + +bool VerbStubUserClient::start(IOService * provider) +{ + bool result = IOUserClient::start(provider); + IOLog("Client::start\n"); + + if(!result) + return(result); + + /* + * Provider is always com_XPS_VerbStub + */ + assert(OSDynamicCast(com_XPS_VerbStub, provider)); + providertarget = (com_XPS_VerbStub*) provider; + + mOpenCount = 1; + + return result; +} + +// +// IOUserClient user-kernel boundary interface client exit behavior +// + +IOReturn VerbStubUserClient::clientClose(void) +{ + if (!isInactive()) + terminate(); + + return kIOReturnSuccess; +} + +// +// IOUserClient user-kernel boundary interface stop override +// + +void VerbStubUserClient::stop(IOService * provider) +{ + IOLog("Client::stop\n"); + + IOUserClient::stop(provider); +} + +// +// IOUserClient handle external method +// + +IOReturn VerbStubUserClient::externalMethod(uint32_t selector, IOExternalMethodArguments* arguments, + IOExternalMethodDispatch* dispatch, OSObject* target, void* reference) +{ + DebugLog("%s[%p]::%s(%d, %p, %p, %p, %p)\n", getName(), this, __FUNCTION__, selector, arguments, dispatch, target, reference); + + if (selector < (uint32_t)kClientNumMethods) + { + dispatch = (IOExternalMethodDispatch *)&sMethods[selector]; + + if (!target) + { + if (selector == kClientExecuteVerb) + target = providertarget; + else + target = this; + } + } + + return IOUserClient::externalMethod(selector, arguments, dispatch, target, reference); +} + +IOReturn VerbStubUserClient::executeVerb(com_XPS_VerbStub* target, void* reference, IOExternalMethodArguments* arguments) +{ + arguments->scalarOutput[0] = target->ExternalCommand((UInt32)arguments->scalarInput[0]); + return kIOReturnSuccess; +} + +//********************************************************************* +// VerbStub Boot-Time Residency Component: +//********************************************************************* + +// +// Stay resident to load the kext when needed +// + +OSDefineMetaClassAndStructors(VerbStubResidency, IOService) + +bool VerbStubResidency::start(IOService *provider) +{ + // announce version + extern kmod_info_t kmod_info; + + // place version in ioreg properties + char buf[128]; + snprintf(buf, sizeof(buf), "%s %s", kmod_info.name, kmod_info.version); + setProperty("VerbStub,Version", buf); + + return super::start(provider); +} diff --git a/VerbStub_Source/VerbStub/VerbStub.hpp b/VerbStub_Source/VerbStub/VerbStub.hpp new file mode 100644 index 0000000..aa6eab5 --- /dev/null +++ b/VerbStub_Source/VerbStub/VerbStub.hpp @@ -0,0 +1,115 @@ +/* + * Released under "The GNU General Public License (GPL-2.0)" + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// +// Adapted from CodecCommander: +// https://github.com/Dolnor/EAPD-Codec-Commander +// +// Apple Driver Documentation +// +// Writing a kernel extension: +// https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptIOKit/iokit_tutorial.html +// IOKit Fundamentals: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html +// Writing an IOKit driver: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/WritingDeviceDriver/Introduction/Intro.html +// Accessing Hardware: +// https://developer.apple.com/library/content/documentation/DeviceDrivers/Conceptual/AccessingHardware/AH_Intro/AH_Intro.html +// User Client Info (sample user client driver interface): +// https://developer.apple.com/library/content/samplecode/SimpleUserClient/Listings/User_Client_Info_txt.html +// + +#include +#include +#include "IntelHDA.h" + +// External client methods +enum +{ + kClientExecuteVerb = 0, + kClientNumMethods +}; + +class com_XPS_VerbStub : public IOService +{ + OSDeclareDefaultStructors(com_XPS_VerbStub) +public: + virtual bool init(OSDictionary *dictionary = 0); + virtual void free(void); + virtual IOService *probe(IOService *provider, SInt32 *score); + virtual bool start(IOService *provider); + virtual void stop(IOService *provider); + + UInt32 ExternalCommand(UInt32 command); + +private: // Only for use by com_XPS_VerbStub::functions + IOService *AudioDevc = NULL; + IntelHDA *HDADevice = NULL; + +}; + +class VerbStubUserClient : public IOUserClient +{ + /* + * Declare the metaclass information that is used for runtime + * typechecking of IOKit objects. + */ + + OSDeclareDefaultStructors(VerbStubUserClient) + +private: + com_XPS_VerbStub* providertarget; + task_t mTask; + SInt32 mOpenCount; + + static const IOExternalMethodDispatch sMethods[kClientNumMethods]; + +public: + + /* IOService overrides */ + + virtual bool start(IOService* provider); + virtual void stop(IOService* provider); + + /* IOUserClient overrides */ + + virtual bool initWithTask(task_t owningTask, void * securityID, UInt32 type, OSDictionary* properties); + virtual IOReturn clientClose(void); + + virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments *arguments, IOExternalMethodDispatch* dispatch = 0, + OSObject* target = 0, void* reference = 0); + /* External methods */ + + static IOReturn executeVerb(com_XPS_VerbStub* target, void* reference, IOExternalMethodArguments* arguments); +}; + +class VerbStubResidency : public IOService +{ +private: + + /* + * Declare the metaclass information that is used for runtime + * typechecking of IOKit objects. + */ + + OSDeclareDefaultStructors(VerbStubResidency); + + // standard IOKit methods + virtual bool start(IOService *provider); +}; diff --git a/VerbStub_Source/hda-verb/hda-verb.c b/VerbStub_Source/hda-verb/hda-verb.c new file mode 100644 index 0000000..3590bd6 --- /dev/null +++ b/VerbStub_Source/hda-verb/hda-verb.c @@ -0,0 +1,470 @@ +/* + * Accessing HD-audio verbs via hwdep interface + * Version 0.3 + * + * Copyright (c) 2008 Takashi Iwai + * + * Licensed under GPL v2 or later. + */ + +// +// Adapted from hda-verb from alsa-tools: +// https://www.alsa-project.org/main/index.php/Main_Page +// + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +#include "hda_hwdep.h" + +#define AC_VERB_GET_STREAM_FORMAT 0x0a00 +#define AC_VERB_GET_AMP_GAIN_MUTE 0x0b00 +#define AC_VERB_GET_PROC_COEF 0x0c00 +#define AC_VERB_GET_COEF_INDEX 0x0d00 +#define AC_VERB_PARAMETERS 0x0f00 +#define AC_VERB_GET_CONNECT_SEL 0x0f01 +#define AC_VERB_GET_CONNECT_LIST 0x0f02 +#define AC_VERB_GET_PROC_STATE 0x0f03 +#define AC_VERB_GET_SDI_SELECT 0x0f04 +#define AC_VERB_GET_POWER_STATE 0x0f05 +#define AC_VERB_GET_CONV 0x0f06 +#define AC_VERB_GET_PIN_WIDGET_CONTROL 0x0f07 +#define AC_VERB_GET_UNSOLICITED_RESPONSE 0x0f08 +#define AC_VERB_GET_PIN_SENSE 0x0f09 +#define AC_VERB_GET_BEEP_CONTROL 0x0f0a +#define AC_VERB_GET_EAPD_BTLENABLE 0x0f0c +#define AC_VERB_GET_DIGI_CONVERT_1 0x0f0d +#define AC_VERB_GET_DIGI_CONVERT_2 0x0f0e +#define AC_VERB_GET_VOLUME_KNOB_CONTROL 0x0f0f +#define AC_VERB_GET_GPIO_DATA 0x0f15 +#define AC_VERB_GET_GPIO_MASK 0x0f16 +#define AC_VERB_GET_GPIO_DIRECTION 0x0f17 +#define AC_VERB_GET_GPIO_WAKE_MASK 0x0f18 +#define AC_VERB_GET_GPIO_UNSOLICITED_RSP_MASK 0x0f19 +#define AC_VERB_GET_GPIO_STICKY_MASK 0x0f1a +#define AC_VERB_GET_CONFIG_DEFAULT 0x0f1c +#define AC_VERB_GET_SUBSYSTEM_ID 0x0f20 + +#define AC_VERB_SET_STREAM_FORMAT 0x200 +#define AC_VERB_SET_AMP_GAIN_MUTE 0x300 +#define AC_VERB_SET_PROC_COEF 0x400 +#define AC_VERB_SET_COEF_INDEX 0x500 +#define AC_VERB_SET_CONNECT_SEL 0x701 +#define AC_VERB_SET_PROC_STATE 0x703 +#define AC_VERB_SET_SDI_SELECT 0x704 +#define AC_VERB_SET_POWER_STATE 0x705 +#define AC_VERB_SET_CHANNEL_STREAMID 0x706 +#define AC_VERB_SET_PIN_WIDGET_CONTROL 0x707 +#define AC_VERB_SET_UNSOLICITED_ENABLE 0x708 +#define AC_VERB_SET_PIN_SENSE 0x709 +#define AC_VERB_SET_BEEP_CONTROL 0x70a +#define AC_VERB_SET_EAPD_BTLENABLE 0x70c +#define AC_VERB_SET_DIGI_CONVERT_1 0x70d +#define AC_VERB_SET_DIGI_CONVERT_2 0x70e +#define AC_VERB_SET_VOLUME_KNOB_CONTROL 0x70f +#define AC_VERB_SET_GPIO_DATA 0x715 +#define AC_VERB_SET_GPIO_MASK 0x716 +#define AC_VERB_SET_GPIO_DIRECTION 0x717 +#define AC_VERB_SET_GPIO_WAKE_MASK 0x718 +#define AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK 0x719 +#define AC_VERB_SET_GPIO_STICKY_MASK 0x71a +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_0 0x71c +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_1 0x71d +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_2 0x71e +#define AC_VERB_SET_CONFIG_DEFAULT_BYTES_3 0x71f +#define AC_VERB_SET_CODEC_RESET 0x7ff + +#define AC_PAR_VENDOR_ID 0x00 +#define AC_PAR_SUBSYSTEM_ID 0x01 +#define AC_PAR_REV_ID 0x02 +#define AC_PAR_NODE_COUNT 0x04 +#define AC_PAR_FUNCTION_TYPE 0x05 +#define AC_PAR_AUDIO_FG_CAP 0x08 +#define AC_PAR_AUDIO_WIDGET_CAP 0x09 +#define AC_PAR_PCM 0x0a +#define AC_PAR_STREAM 0x0b +#define AC_PAR_PIN_CAP 0x0c +#define AC_PAR_AMP_IN_CAP 0x0d +#define AC_PAR_CONNLIST_LEN 0x0e +#define AC_PAR_POWER_STATE 0x0f +#define AC_PAR_PROC_CAP 0x10 +#define AC_PAR_GPIO_CAP 0x11 +#define AC_PAR_AMP_OUT_CAP 0x12 +#define AC_PAR_VOL_KNB_CAP 0x13 + +/* + */ +#define VERBSTR(x) { .val = AC_VERB_##x, .str = #x } +#define PARMSTR(x) { .val = AC_PAR_##x, .str = #x } + +struct strtbl { + int val; + const char *str; +}; + +static struct strtbl hda_verbs[] = { + VERBSTR(GET_STREAM_FORMAT), + VERBSTR(GET_AMP_GAIN_MUTE), + VERBSTR(GET_PROC_COEF), + VERBSTR(GET_COEF_INDEX), + VERBSTR(PARAMETERS), + VERBSTR(GET_CONNECT_SEL), + VERBSTR(GET_CONNECT_LIST), + VERBSTR(GET_PROC_STATE), + VERBSTR(GET_SDI_SELECT), + VERBSTR(GET_POWER_STATE), + VERBSTR(GET_CONV), + VERBSTR(GET_PIN_WIDGET_CONTROL), + VERBSTR(GET_UNSOLICITED_RESPONSE), + VERBSTR(GET_PIN_SENSE), + VERBSTR(GET_BEEP_CONTROL), + VERBSTR(GET_EAPD_BTLENABLE), + VERBSTR(GET_DIGI_CONVERT_1), + VERBSTR(GET_DIGI_CONVERT_2), + VERBSTR(GET_VOLUME_KNOB_CONTROL), + VERBSTR(GET_GPIO_DATA), + VERBSTR(GET_GPIO_MASK), + VERBSTR(GET_GPIO_DIRECTION), + VERBSTR(GET_GPIO_WAKE_MASK), + VERBSTR(GET_GPIO_UNSOLICITED_RSP_MASK), + VERBSTR(GET_GPIO_STICKY_MASK), + VERBSTR(GET_CONFIG_DEFAULT), + VERBSTR(GET_SUBSYSTEM_ID), + + VERBSTR(SET_STREAM_FORMAT), + VERBSTR(SET_AMP_GAIN_MUTE), + VERBSTR(SET_PROC_COEF), + VERBSTR(SET_COEF_INDEX), + VERBSTR(SET_CONNECT_SEL), + VERBSTR(SET_PROC_STATE), + VERBSTR(SET_SDI_SELECT), + VERBSTR(SET_POWER_STATE), + VERBSTR(SET_CHANNEL_STREAMID), + VERBSTR(SET_PIN_WIDGET_CONTROL), + VERBSTR(SET_UNSOLICITED_ENABLE), + VERBSTR(SET_PIN_SENSE), + VERBSTR(SET_BEEP_CONTROL), + VERBSTR(SET_EAPD_BTLENABLE), + VERBSTR(SET_DIGI_CONVERT_1), + VERBSTR(SET_DIGI_CONVERT_2), + VERBSTR(SET_VOLUME_KNOB_CONTROL), + VERBSTR(SET_GPIO_DATA), + VERBSTR(SET_GPIO_MASK), + VERBSTR(SET_GPIO_DIRECTION), + VERBSTR(SET_GPIO_WAKE_MASK), + VERBSTR(SET_GPIO_UNSOLICITED_RSP_MASK), + VERBSTR(SET_GPIO_STICKY_MASK), + VERBSTR(SET_CONFIG_DEFAULT_BYTES_0), + VERBSTR(SET_CONFIG_DEFAULT_BYTES_1), + VERBSTR(SET_CONFIG_DEFAULT_BYTES_2), + VERBSTR(SET_CONFIG_DEFAULT_BYTES_3), + VERBSTR(SET_CODEC_RESET), + { }, /* end */ +}; + +static struct strtbl hda_params[] = { + PARMSTR(VENDOR_ID), + PARMSTR(SUBSYSTEM_ID), + PARMSTR(REV_ID), + PARMSTR(NODE_COUNT), + PARMSTR(FUNCTION_TYPE), + PARMSTR(AUDIO_FG_CAP), + PARMSTR(AUDIO_WIDGET_CAP), + PARMSTR(PCM), + PARMSTR(STREAM), + PARMSTR(PIN_CAP), + PARMSTR(AMP_IN_CAP), + PARMSTR(CONNLIST_LEN), + PARMSTR(POWER_STATE), + PARMSTR(PROC_CAP), + PARMSTR(GPIO_CAP), + PARMSTR(AMP_OUT_CAP), + PARMSTR(VOL_KNB_CAP), + { }, /* end */ +}; + +// +// Global Variables +// + +io_service_t VerbStubIOService; +io_connect_t DataConnection; +uint32_t connectiontype = 0; + +// +// Open connection to IOService +// + +uint32_t OpenServiceConnection() +{ + // + // Having a kernel-side server (VerbStub) and a user-side client (hda-verb) is really the only way to ensure that hda- + // verb won't break when IOAudioFamily changes. This 2-component solution is necessary because we can't compile kernel + // libraries into user-space programs on macOS and expect them to work generically. + // + // Additionally, if this program were made as a single executable that accessed device memory regions directly, it would + // only be guaranteed to work for one machine on one BIOS version since memory regions change depending on hardware + // configurations. This is why Raspberry Pis, STM32s, and other embedded platforms are nice to program on: They don't + // change much between versions so programs can be made extremely lightweight. Linux also does a pretty good job + // achieving a similar situation, since everything (devices, buses, etc.) on Linux is represented by an easily + // accessible file (just look at how simple the hda-verb program in alsa-tools is! All it uses is ioctl). + // + + CFMutableDictionaryRef dict = IOServiceMatching("com_XPS_VerbStub"); + + // Use IOServiceGetMatchingService since we can reasonably expect "VerbStub" is the only IORegistryEntry of its kind. + // Otherwise IOServiceGetMatchingServices with an iterating algorithm must be used to find the kernel extension. + + VerbStubIOService = IOServiceGetMatchingService(kIOMasterPortDefault, dict); + + // Hopefully the kernel extension loaded properly so it can be found. + + if (!VerbStubIOService) + { + fprintf(stderr, "Could not locate VerbStub kext. Ensure it is loaded; verbs cannot be sent otherwise.\n"); + return -1; + } + + // Connect to the IOService object + // Note: kern_return_t is just an int + kern_return_t kernel_return_status = IOServiceOpen(VerbStubIOService, mach_task_self(), connectiontype, &DataConnection); + + if (kernel_return_status != kIOReturnSuccess) + { + fprintf(stderr, "Failed to open VerbStub IOService: %08x.\n", kernel_return_status); + return -1; + } + + return kernel_return_status; // 0 if successful +} + +// +// Send verb command +// + +static uint32_t VerbCommand(uint32_t command) +{ + // + // Call the function ultimately responsible for sending commands in the kernel extension. That function will return the + // response we also want. + // https://lists.apple.com/archives/darwin-drivers/2008/Mar/msg00007.html + // + + uint32_t inputCount = 1; // Number of input arguments + uint32_t outputCount = 1; // Number of elements in output + uint64_t input = command; // Array of input scalars + uint64_t output; // Array of output scalars + + // IOConnectCallScalarMethod was introduced in Mac OS X 10.5 + + kern_return_t kernel_return_status = IOConnectCallScalarMethod(DataConnection, connectiontype, &input, inputCount, &output, &outputCount); + + if (kernel_return_status != kIOReturnSuccess) + { + fprintf(stderr, "Error sending command.\n"); + return -1; + } + + // Return command response + return (uint32_t)output; +} + +// +// Close connection to IOService +// + +void CloseServiceConnection() +{ + // Done with the VerbStub IOService object, so we don't need to hold on to it anymore + IOObjectRelease(VerbStubIOService); +} + +static void list_keys(struct strtbl *tbl, int one_per_line) +{ + int c = 0; + for (; tbl->str; tbl++) { + size_t len = strlen(tbl->str) + 2; + if (!one_per_line && c + len >= 80) { + fprintf(stderr, "\n"); + c = 0; + } + if (one_per_line) + fprintf(stderr, " %s\n", tbl->str); + else if (!c) + fprintf(stderr, " %s", tbl->str); + else + fprintf(stderr, ", %s", tbl->str); + c += 2 + len; + } + if (!one_per_line) + fprintf(stderr, "\n"); +} + +/* look up a value from the given string table */ +static int lookup_str(struct strtbl *tbl, const char *str) +{ + struct strtbl *p, *found; + size_t len = strlen(str); + + found = NULL; + for (p = tbl; p->str; p++) { + if (!strncmp(str, p->str, len)) { + if (found) { + fprintf(stderr, "No unique key '%s'\n", str); + return -1; + } + found = p; + } + } + if (!found) { + fprintf(stderr, "No key matching with '%s'\n", str); + return -1; + } + return found->val; +} + +/* convert a string to upper letters */ +static void strtoupper(char *str) +{ + for (; *str; str++) + *str = toupper(*str); +} + +static void usage(void) +{ + fprintf(stderr, "usage: hda-verb [option] nid verb param\n"); + fprintf(stderr, " -l List known verbs and parameters\n"); + fprintf(stderr, " -L List known verbs and parameters (one per line)\n"); +} + +static void list_verbs(int one_per_line) +{ + fprintf(stderr, "known verbs:\n"); + list_keys(hda_verbs, one_per_line); + fprintf(stderr, "known parameters:\n"); + list_keys(hda_params, one_per_line); +} + +// +// Main +// + +int main(int argc, char **argv) +{ + // Local variables + kern_return_t ServiceConnectionStatus; + int version, c, timeout; + int nid, verb, param; + struct hda_verb_ioctl val; + char **p; + int trylimit = 5; + + // Check for -l or -L flag + while ((c = getopt(argc, argv, "lL")) >= 0) { + switch (c) { + case 'l': + list_verbs(0); + return 0; + case 'L': + list_verbs(1); + return 0; + default: + usage(); + return 1; + } + } + + // Check for correct number of command-line arguments + if (argc - optind < 3) { + usage(); + return 1; + } + + // Mac version of hda-verb + version = 0x2710; // Darwin + + // If this error appears, the program was compiled incorrectly + if (version < HDA_HWDEP_VERSION) { + fprintf(stderr, "Invalid version number 0x%x\n", version); + return 1; + } + + p = argv + optind; + nid = strtol(*p, NULL, 0); // Don't worry about the warning here. This should never be bigger than an int. + if (nid < 0 || nid > 0xff) { + fprintf(stderr, "invalid nid %s\n", *p); + return 1; + } + + p++; + if (!isdigit(**p)) { + strtoupper(*p); + verb = lookup_str(hda_verbs, *p); + if (verb < 0) + return 1; + } else { + verb = strtol(*p, NULL, 0); // Don't worry about the warning here. This should never be bigger than an int. + if (verb < 0 || verb > 0xfff) { + fprintf(stderr, "invalid verb %s\n", *p); + return 1; + } + } + p++; + if (!isdigit(**p)) { + strtoupper(*p); + param = lookup_str(hda_params, *p); + if (param < 0) + return 1; + } else { + param = strtol(*p, NULL, 0); // Don't worry about the warning here. This should never be bigger than an int. + if (param < 0 || param > 0xffff) { + fprintf(stderr, "invalid param %s\n", *p); + return 1; + } + } + // Establish user-kernel connection + timeout = 0; + ServiceConnectionStatus = OpenServiceConnection(); + if (ServiceConnectionStatus != kIOReturnSuccess) + { + while (ServiceConnectionStatus != kIOReturnSuccess && timeout < trylimit) + { + timeout++; + fprintf(stderr, "Error establshing IOService connection. Retrying in 1 second... (Attempt #%d/%d)\n", timeout, trylimit); + sleep (1); + ServiceConnectionStatus = OpenServiceConnection(); + } + } + + if (timeout == trylimit) + { + return kIOReturnError; + } + + // Parameter display indicates successful connection + fprintf(stderr, "nid = 0x%x, verb = 0x%x, param = 0x%x\n", + nid, verb, param); + + // Properly format command + val.verb = HDA_VERB(nid, verb, param); + fprintf(stderr, "Verb Command = 0x%x\n", val.verb); + + // Send command + val.res = VerbCommand(val.verb); + fprintf(stderr, "Response = 0x%x\n", val.res); + + // Clean up and exit + CloseServiceConnection(); + return 0; +} diff --git a/VerbStub_Source/hda-verb/hda_hwdep.h b/VerbStub_Source/hda-verb/hda_hwdep.h new file mode 100644 index 0000000..bb753f3 --- /dev/null +++ b/VerbStub_Source/hda-verb/hda_hwdep.h @@ -0,0 +1,42 @@ +/* + * HWDEP Interface for HD-audio codec + * + * Copyright (c) 2007 Takashi Iwai + * + * This driver is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This driver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// +// Adapted from hda-verb from alsa-tools: +// https://www.alsa-project.org/main/index.php/Main_Page +// + +#ifndef __SOUND_HDA_HWDEP_H +#define __SOUND_HDA_HWDEP_H + +#define HDA_HWDEP_VERSION 0x2710 /* Darwin */ + +/* verb */ +#define HDA_REG_NID_SHIFT 20 +#define HDA_REG_VERB_SHIFT 8 +#define HDA_REG_VAL_SHIFT 0 +#define HDA_VERB(nid,verb,param) ((nid)<<20 | (verb)<<8 | (param)) + +struct hda_verb_ioctl { + u32 verb; /* HDA_VERB() */ + u32 res; /* response */ +}; + +#endif