[mythtv-users] PPC and MythMusic FIX (at least for mp3s)

Ryan Oltman roltman at ae.uiuc.edu
Fri Jan 13 03:58:48 UTC 2006


My first contribution back to the opensource community (after using Linux for 
the last 11 years its about damn time).

Okay after being bugged by mythmusic on not working on a ppc I decided to sit 
down and figure this thing out.  Especially since there appears to be 2 other 
people in the world that would love to have a mac-mini frontend to mythtv 
using linux.

If you don't know the mac mini works fine with mplayer and the 1.2GHz is close 
to playing 1920x1080 xvid files without too many frame drops, but it would 
produce noise under mythmusic.

The problem is that libmad returns little endian audio and the powerpc is a 
big endian machine.  Simply compile minimad.c that comes with libmad on a ppc 
machine and see that it doesn't work.  You get noise.

I'm using 0.18.1 from gentoo on the mac mini.  The mythmusic plugin code I 
used for my fixes came from: 
http://cvs.mythtv.org/trac/
I used the release-0-18-fixes to compile only mythmusic.

I know vorbis file have the same problem, but I don't use them (I did test 
one), so I figure there is a similar fix that can be done in that file.

The fix:

swap lines 486 & 487 and 493 & 494 of maddecoder.cpp

The diff (which is a little confusing):
486d485
<         *(output_buf + output_at++) = ((sample >> 0) & 0xff);
487a487
>         *(output_buf + output_at++) = ((sample >> 0) & 0xff);
493d492
<             *(output_buf + output_at++) = ((sample >> 0) & 0xff);
494a494
>             *(output_buf + output_at++) = ((sample >> 0) & 0xff);


Original Code:

    while (samples--)
    {
        signed int sample;

        if (output_bytes + 4096 > globalBufferSize)
        {
            flush();
        }
        sample = fix_sample(16, *left++);
        *(output_buf + output_at++) = ((sample >> 0) & 0xff);
        *(output_buf + output_at++) = ((sample >> 8) & 0xff);
        output_bytes += 2;

        if (channels == 2)
        {
            sample = fix_sample(16, *right++);
            *(output_buf + output_at++) = ((sample >> 0) & 0xff);
            *(output_buf + output_at++) = ((sample >> 8) & 0xff);
            output_bytes += 2;
        }
    }

Big Endian Code (works on PPC):
    while (samples--)
    {
        signed int sample;

        if (output_bytes + 4096 > globalBufferSize)
        {
            flush();
        }
        sample = fix_sample(16, *left++);
        *(output_buf + output_at++) = ((sample >> 8) & 0xff);
        *(output_buf + output_at++) = ((sample >> 0) & 0xff);
        output_bytes += 2;

        if (channels == 2)
        {
            sample = fix_sample(16, *right++);
            *(output_buf + output_at++) = ((sample >> 8) & 0xff);
            *(output_buf + output_at++) = ((sample >> 0) & 0xff);
            output_bytes += 2;
        }
    }

Compile and enjoy the music on the mac-mini!

-- 
Ryan S Oltman
roltman at uiuc.edu
www.ae.uiuc.edu
Manager of System Services
University of Illinois - Urbana Champaign


More information about the mythtv-users mailing list