<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Jul 23, 2011, at 5:24 PM, Ron Frederick wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Jul 18, 2011, at 3:08 AM, Felix Kühne wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi there,<br><div>
<span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div><div><br></div></div></span></div><div><div>On 18.07.2011, at 08:42, David Fuhrmann wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Since vlc 1.1.11 digital audio output (ac3, dts) is broken on mac os. The following patch fixes the problem. It is tested with mac os 10.6, vlc 1.1.11 and various audio formats.<br></div></blockquote></div><br><div>Thanks a lot for the patch. I had to re-write the AUHAL API parts of this module to ensure compatibility with future Mac OS X releases. Due to a lack of an optical audio testing device, these mistakes weren't caught.</div><div><br></div><div>Your patch was applied to the stable and unstable branches of VLC and will be part of tonight's nightly builds available at <a href="http://nightlies.videolan.org/">nightlies.videolan.org</a>.</div></div></blockquote><div><br></div>Unfortunately, this still isn't working for me under 10.6.8. While it now tries to send encoded output again, the audio stutters on the files I've tried, as if maybe it isn't sending the data at the right rate. Going back to 1.1.11, the audio from the same files plays smoothly over the optical audio out but only in stereo.</div><div><br></div><div>I also gave Lion a quick try on another machine and optical audio output didn't seem to work at all, in either stereo or surround.</div></div></blockquote></div><div><br></div><div>I did a little more digging into this, and the problem appears to be that it is selecting the wrong output format. In particular, I can see it selecting 96000 Hz for a sample rate instead of 48000 Hz:</div><div><br></div><div><div>a52 debug: A/52 channels:6 samplerate:48000 bitrate:384000</div><div>main debug: VLC is looking for: 'a52 ' 48000 Hz 3F2R/LFE frame=1536 samples/1536 bytes</div><div>auhal debug: found 3 audio device(s)</div><div>auhal debug: DevID: 260 DevName: Built-in Microphone</div><div>auhal debug: this device is INPUT only. skipping...</div><div>auhal debug: DevID: 258 DevName: Built-in Input</div><div>auhal debug: this device is INPUT only. skipping...</div><div>auhal debug: DevID: 262 DevName: Built-in Output</div><div>auhal debug: found 23 stream formats</div><div>auhal debug: supported format: [96000][mcpl][12][4][1][4][2][16]</div><div>auhal debug: supported format: [88200][mcpl][12][4][1][4][2][16]</div><div>auhal debug: supported format: [48000][mcpl][12][4][1][4][2][16]</div><div>auhal debug: supported format: [44100][mcpl][12][4][1][4][2][16]</div><div>auhal debug: supported format: [32000][mcpl][12][4][1][4][2][16]</div><div>auhal debug: supported format: [96000][mcpl][4][8][1][8][2][20]</div><div>auhal debug: supported format: [88200][mcpl][4][8][1][8][2][20]</div><div>auhal debug: supported format: [48000][mcpl][4][8][1][8][2][20]</div><div>auhal debug: supported format: [44100][mcpl][4][8][1][8][2][20]</div><div>auhal debug: supported format: [32000][mcpl][4][8][1][8][2][20]</div><div>auhal debug: supported format: [96000][mcpl][4][8][1][8][2][24]</div><div>auhal debug: supported format: [88200][mcpl][4][8][1][8][2][24]</div><div>auhal debug: supported format: [48000][mcpl][4][8][1][8][2][24]</div><div>auhal debug: supported format: [44100][mcpl][4][8][1][8][2][24]</div><div>auhal debug: supported format: [32000][mcpl][4][8][1][8][2][24]</div><div>auhal debug: supported format: [96000][mcpl][9][8][1][8][2][32]</div><div>auhal debug: supported format: [88200][mcpl][9][8][1][8][2][32]</div><div>auhal debug: supported format: [48000][mcpl][9][8][1][8][2][32]</div><div>auhal debug: supported format: [44100][mcpl][9][8][1][8][2][32]</div><div>auhal debug: supported format: [32000][mcpl][9][8][1][8][2][32]</div><div>auhal debug: supported format: [96000][3cac][76][6144][1536][0][2][16]</div><div>auhal debug: supported format: [48000][3cac][76][6144][1536][0][2][16]</div><div>auhal debug: supported format: [44100][3cac][76][6144][1536][0][2][16]</div><div>auhal debug: audio device supports digital output</div><div>auhal debug: original stream format: [0][    ][4076007936][4076007936][4076007936][4076007936][4076007936][4076007936]</div><div>auhal debug: setting stream format: [96000][3cac][76][6144][1536][0][2][16]</div><div>auhal debug: reached timeout</div><div>auhal debug: actual format in use: [96000][3cac][76][6144][1536][0][2][16]</div></div><div><br></div>Looking into the code, one problem I see is that it is using a variable that doesn't appear to be set yet when looping over the list of stream formats trying to find a match:<div><br></div><div><div><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; ">        if( b_digital )</span></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">        {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            /* if this stream supports a digital (cac3) format, then go set it. */</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            int i_requested_rate_format = -1;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            int i_current_rate_format = -1;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            int i_backup_rate_format = -1;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            p_sys->i_stream_id = p_streams[i];</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            p_sys->i_stream_index = i;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            if( !p_sys->b_revert )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                /* Retrieve the original format of this stream first if not done so already */</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                i_param_size = sizeof( p_sys->sfmt_revert );</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                err = AudioObjectGetPropertyData( p_sys->i_stream_id, &physicalFormatsAddress, 0, NULL, &i_param_size, &p_sys->sfmt_revert );</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                if( err != noErr )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    msg_Err( p_aout, "could not retrieve the original streamformat: [%4.4s]", (char *)&err );</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    continue;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                p_sys->b_revert = true;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            for( int j = 0; j < i_formats; j++ )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                if( p_format_list[j].mFormatID == 'IAC3' ||</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                      p_format_list[j].mFormatID == kAudioFormat60958AC3 )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    if( p_format_list[j].mSampleRate == </span><b><i>p_aout->output.output.i_rate</i></b><span class="Apple-style-span" style="font-size: 9px;"> )        <--- This isn't set until below.</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                        i_requested_rate_format = j;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                        break;</span></font></div><div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    else if( p_format_list[j].mSampleRate == p_sys->sfmt_revert.mSampleRate )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                        i_current_rate_format = j;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    else</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    {</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                        if( i_backup_rate_format < 0 || p_format_list[j].mSampleRate > p_format_list[i_backup_rate_format].mSampleRate )</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                            i_backup_rate_format = j;</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                    }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            if( i_requested_rate_format >= 0 ) /* We prefer to output at the samplerate of the original audio */</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                p_sys->stream_format = p_format_list[i_requested_rate_format];</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            else if( i_current_rate_format >= 0 ) /* If not possible, we will try to use the current samplerate of the device */</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">                p_sys->stream_format = p_format_list[i_current_rate_format];</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">            else p_sys->stream_format = p_format_list[i_backup_rate_format]; /* And if we have to, any digital format will be just fine (highest rate possible) */</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;">        }</span></font></div><div><font class="Apple-style-span" face="'Courier New'" size="1"><span class="Apple-style-span" style="font-size: 9px;"><div>        free( p_format_list );</div><div>    }</div><div>    free( p_streams );</div><div><br></div><div>    msg_Dbg( p_aout, STREAM_FORMAT_MSG( "original stream format: ", p_sys->sfmt_revert ) );</div><div><br></div><div>    if( !AudioStreamChangeFormat( p_aout, p_sys->i_stream_id, p_sys->stream_format ) )</div><div>        return false;</div><div><br></div><div>    /* Set the format flags */</div><div>    if( p_sys->stream_format.mFormatFlags & kAudioFormatFlagIsBigEndian )</div><div>        p_aout->output.output.i_format = VLC_CODEC_SPDIFB;</div><div>    else</div><div>        p_aout->output.output.i_format = VLC_CODEC_SPDIFL;</div><div>    p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE;</div><div>    p_aout->output.output.i_frame_length = A52_FRAME_NB;</div><div>    p_aout->output.i_nb_samples = p_aout->output.output.i_frame_length;</div><div>    <b><i>p_aout->output.output.i_rate</i></b> = (unsigned int)p_sys->stream_format.mSampleRate;</div><div>    aout_FormatPrepare( &p_aout->output.output );</div><div>    aout_VolumeNoneInit( p_aout );</div><div><br></div></span></font></div><div>In fact, the i_rate parameter there is set based on p_sys->stream_format, but that is set based on the value of i_requested_rate_format, which the above "for" loop is trying to set by comparing against i_rate. I haven't figured out the right way to fix this, though. I need to look through the a52 module to see if it exports its audio format information somewhere that auhal would have access to. If anyone already knows this code, though, I thought I'd share the above in the hopes that it might help you to fix it.</div></div><div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>-- </div><div>Ron Frederick</div><div><a href="mailto:ronf@timeheart.net">ronf@timeheart.net</a></div></div>
</div>
<br></div></body></html>