Jump to content
86 posts in this topic

Recommended Posts

@MaLd0n you are crazy 😃

I only installed HDAUniversal (and disabled AppleALC), and it works perfectly, including my microphone.
That mic wouldn't work with VoodooHDA (even though it was detected), but everything runs fine with your KEXT 🤩

 

Thank you so much! :thumbsup_anim:

 

btw. my machine is a Fujitsu Lifebook with a Realtek ALC255.

I set the layout-id via a DeviceProperty entry: "layout-id", type: data, value: <FF000000>

  • Like 5
On 7/3/2026 at 4:24 PM, MaLd0n said:

The problem was that the app was not always using the real hardware codec ID as the primary source. Check if work now...

 

Perfect, ALC1220 well detected, thanks.

  • Like 2
1 hour ago, Oyecomova said:

HDAUniversal does not work for my LG Ultra HD monitor connected via HDMI to the Intel CoffeeLake-H GT2 [UHD Graphics 630] (Slot 0, GPU 1)

 

On 7/3/2026 at 6:56 PM, LockDown said:

 

Only for onboard sound for now

 

  • Like 3

I'm thoroughly enjoying the sound quality HDAUniversal as my testing continues.  I'm currently trying to diagnose one issue and wanted to ask about it first before I investigate further.  When my HP EliteDesk 800 G4 Mini sleeps and wakes, there is a loud audio "tick" or "pop" (both when entering sleep and again when waking from sleep).  Is this unique to me, or are others observing this?  I don't experience this with VoodooHDA or AppleALC.  Thank you.

  • Like 3
1 hour ago, deeveedee said:

there is a loud audio "tick" or "pop"

reproduce this problem and extract logs. lets check it.

  • Like 3
  • Thanks 1
23 hours ago, MaLd0n said:

reproduce this problem and extract logs. lets check it.

Thank you, MaLd0n...

 

  1. The zip generated by Collect-HDAUniversal.command: attached

  2. Your codec model: Conexant CX20632

  3. Your layout-id: 20

  4. macOS version: 26.6 Beta (25G5052e)

  5. Bootloader used: Open Core 1.0.7

  6. Whether the kext is installed in /Library/Extensions: Yes

  7. A clear description of the problem: On transition to sleep, audio generates a loud "tick"/"pop"; On wake, audio generates a loud "tick"/"pop".  I do not observe this with VoodooHDA 4.0 or with AppleALC/AppleHDA.

  8. Steps to reproduce the issue: Sleep and listen for loud "tick"/'pop"; Wake and listen for loud "tick"/"pop"

 

 

EDIT: @MaLd0n I'm not sure if this helps, but when using VoodooHDA.kext 4.0, the HP EliteDesk 800 G4 Mini requires DisableInputMonitor=True to avoid loud "pop" on macOS startup.

Screenshot2026-07-06at9_27_36AM.png.08de19aad5436e26eecd41d1dc86db71.png

 

EDIT2: @MaLd0n To be sure I wasn't leading you on a wild goose chase, I just performed a clean installation of macOS Tahoe 26.5.2 on this exact same hackintosh (HP EliteDesk 800 G4 Mini) and then installed HDAUniversal with SIP csr-active-config = <03000000>.  The loud "pop" on Sleep and Wake is still reproducible on this brand-new installation of macOS Tahoe.  For testing, I'm using your latest HDAUniversal that you posted here. I have no other apps installed, so this test environment is a clean installation of Tahoe 26.5.2 with only HDAUniversal installed.

HDAUniversal-Test-Logs-2026-07-05_20-34-06.zip

Edited by deeveedee
  • Like 2
15 hours ago, deeveedee said:

model: Conexant CX20632

HDAUniversal-Release.zipTest this.

Everything related to audio has to be handled very carefully because it is extremely complex. We change one thing and end up breaking another. It is way too complicated.

On sleep, HDAUniversal now mutes the active analog output, waits 3 ms, disables EAPD/PinControl, and detaches the DAC stream before power-down.
On wake, it restores the route silently, enables PinControl/EAPD only after the path/DAC are ready, waits 3 ms, then reapplies the saved volume/mute state.

Quote

bool HDAController::prepareAnalogOutputForSleep(UInt8 cad, const AnalogPath *path) {
    if (!mRegs || !validateAnalogOutputPath(path)) return false;
    UInt32 r = 0;
    bool ok = true;

    ok &= setAnalogOutputVolume(cad, path, 0, true);
    IODelay(3000);

    sendVerb(cad, path->pinNid, HDAU::SetEAPD, 0x00, &r);
    sendVerb(cad, path->pinNid, HDAU::SetPinControl, 0x00, &r);
    sendVerb(cad, path->dacNid, HDAU::SetConverterStreamChannel, 0x00, &r);

    OSSynchronizeIO();
    return ok;
}

Quote

bool HDAController::programAnalogOutputPathWakeSilent(UInt8 cad,
                                                      const AnalogPath *path,
                                                      UInt8 streamId,
                                                      UInt16 format) {
    if (!mRegs || !streamId || !validateAnalogOutputPath(path)) return false;

    UInt8 nodeCount = path->nodeCount > sizeof(path->nodes) ?
                      (UInt8)sizeof(path->nodes) : path->nodeCount;
    UInt32 r = 0;
    bool ok = true;

    powerPathNodes(cad, path->nodes, nodeCount);
    sendVerb(cad, 0x01, HDAU::SetPowerState, 0x00, &r);
    sendVerb(cad, path->pinNid, HDAU::SetPowerState, 0x00, &r);

    ok &= sendVerb(cad, path->dacNid, HDAU::SetPowerState, 0x00, &r);
    ok &= sendVerb(cad, path->dacNid, HDAU::SetConverterFormat, format, &r);
    sendVerb(cad, path->dacNid, HDAU::SetConverterChannelCount, 0x01, &r);
    ok &= sendVerb(cad, path->dacNid, HDAU::SetConverterStreamChannel,
                   (UInt16)((streamId << 4) & 0xF0), &r);

    ok &= setAnalogOutputVolume(cad, path, 0, true);
    ok &= sendVerb(cad, path->pinNid, HDAU::SetPinControl,
                   pinControlForRole(path->role), &r);
    sendVerb(cad, path->pinNid, HDAU::SetEAPD, 0x02, &r);

    IODelay(3000);
    return ok;
}

Quote

void HDAUniversalDevice::prepareForSleepPowerState() {
    prepareTrackedEnginesForSleepDePop("sleep");
    markTrackedEnginesHardwareStateLost("sleep");

    if (mInterruptSource) mInterruptSource->disable();

    if (mController) {
        mController->setStreamInterruptsEnabled(false);
        mController->invalidateAmpPayloadCache();
        mController->stopCommandTransport();
    }
}

Quote

void HDAUniversalEngine::restoreOutputAfterSystemWake(const char *reason) {
    if (mFreeStarted || mDirection != kIOAudioStreamDirectionOutput ||
        !mController || !mHardwarePrepared) return;

    const HDAController::AnalogPath *active =
        (mHeadphoneActive && mHasHeadphonePath) ? &mHeadphonePath : &mPath;

    bool ok = mController->programAnalogOutputPathWakeSilent(
        mCad, active, mPlayback.streamId, mPlayback.format
    );

    if (ok) {
        mOutputPathProgrammed = true;
        mProgrammedOutputPin = active->pinNid;
        mProgrammedOutputDac = active->dacNid;
        clearAppliedVolumeState();
        applyCurrentVolume();
    }

    mOutputWakeDePopPending = false;
}

 

  • Thanks 1
×
×
  • Create New...