view src/dockalbumart/dockalbumart.c @ 2284:d19b53359b24

cleaned up the sndfile wav plugin, currently limiting it ONLY TO WAV PLAYBACK. if somebody is more experienced with it and wants to restore the other formats, go ahead (maybe change the name of the plugin too?).
author mf0102 <0102@gmx.at>
date Wed, 09 Jan 2008 15:41:22 +0100
parents 0803fba87da8
children 7b284f323ad8
line wrap: on
line source

/*
 * dockalbumart: An audacious plugin to change the MacOS dock tile to the
 *     album art.
 * dockalbumart.c: Plugin implementation
 *
 * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice is present in all copies.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <glib.h>
#include <audacious/i18n.h>

#include <Carbon/Carbon.h>

#include <audacious/plugin.h>
#include <audacious/util.h>
#include <audacious/playlist.h>

#include "audacious_player.xpm"

extern gchar *fileinfo_recursive_get_image(const gchar* path, const gchar* file_name, gint depth);

/* utility functions */
static void
dock_set_icon_from_pixbuf(const GdkPixbuf *in)
{
    GdkPixbuf *pixbuf;
    CGColorSpaceRef colorspace;
    CGDataProviderRef data_provider;
    CGImageRef image;
    gpointer data;
    gint rowstride, pixbuf_width, pixbuf_height;
    gboolean has_alpha;
         
    pixbuf = gdk_pixbuf_scale_simple(in, 128, 128, GDK_INTERP_BILINEAR);
    
    data = gdk_pixbuf_get_pixels(pixbuf);
    pixbuf_width = gdk_pixbuf_get_width(pixbuf);
    pixbuf_height = gdk_pixbuf_get_height(pixbuf);
    rowstride = gdk_pixbuf_get_rowstride(pixbuf);
    has_alpha = gdk_pixbuf_get_has_alpha(pixbuf);
        
    /* create the colourspace for the CGImage. */
    colorspace = CGColorSpaceCreateDeviceRGB();
    data_provider = CGDataProviderCreateWithData(NULL, data, pixbuf_height * rowstride, NULL);
    image = CGImageCreate(pixbuf_width, pixbuf_height, 8,
        has_alpha ? 32 : 24, rowstride, colorspace,
        has_alpha ? kCGImageAlphaLast : 0,
        data_provider, NULL, FALSE,   
        kCGRenderingIntentDefault);
    
    /* release the colourspace and data provider, we have what we want. */
    CGDataProviderRelease(data_provider);
    CGColorSpaceRelease(colorspace);

    /* set the dock tile images */
    SetApplicationDockTileImage(image);

    /* and release */
    CGImageRelease(image);
    g_object_unref(pixbuf);
}

static void
pixbuf_find_and_load(Tuple *tuple)
{
    GdkPixbuf *out;
    gchar *tmp;
    const gchar *file_path, *file_name;

    file_name = aud_tuple_get_string(tuple, FIELD_FILE_NAME, NULL);
    file_path = aud_tuple_get_string(tuple, FIELD_FILE_PATH, NULL);

    if (file_name != NULL && file_path != NULL)
    {
        tmp = fileinfo_recursive_get_image(file_path, file_name, 0);
        if (tmp)
        {
            GdkPixbuf *new = gdk_pixbuf_new_from_file(tmp, NULL);
            dock_set_icon_from_pixbuf(new);
            g_object_unref(new);                
        }
        else
        {
            GdkPixbuf *new = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_player_xpm);
            dock_set_icon_from_pixbuf(new);
            g_object_unref(new);
        }
    }
}

/* trigger functions */

static void
dockart_trigger_func_pb_start_cb(gpointer plentry_p, gpointer unused)
{
    PlaylistEntry *entry = (PlaylistEntry *) plentry_p;
    Tuple *tuple;

    if (entry == NULL)
        return;

    tuple = entry->tuple;

    if (tuple == NULL)
        return;

    pixbuf_find_and_load(tuple);
}

static void
dockart_trigger_func_pb_end_cb(gpointer plentry_p, gpointer unused)
{
    GdkPixbuf *new;

    new = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_player_xpm);
    dock_set_icon_from_pixbuf(new);
    g_object_unref(new);
}

static void
dockart_init(void)
{
    aud_hook_associate("playback begin", dockart_trigger_func_pb_start_cb, NULL);
    aud_hook_associate("playback end", dockart_trigger_func_pb_end_cb, NULL);
}

static void
dockart_cleanup(void)
{
    GdkPixbuf *new;

    aud_hook_dissociate("playback begin", dockart_trigger_func_pb_start_cb);
    aud_hook_dissociate("playback end", dockart_trigger_func_pb_end_cb);

    /* reset dock tile */
    new = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_player_xpm);
    dock_set_icon_from_pixbuf(new);
    g_object_unref(new);
}

GeneralPlugin dockart_gp =
{
    .description = "Dock Album Art",
    .init = dockart_init,
    .cleanup = dockart_cleanup
};

GeneralPlugin *dockart_gplist[] = { &dockart_gp, NULL };
SIMPLE_GENERAL_PLUGIN(dockart, dockart_gplist);