blob: 4ccffac0462123baef3b75b90a9893a1a9ba0bc4 [file] [log] [blame]
/*
* Copyright (C) 2015-2015 Freescale Semiconductor, Inc. All rights reserved.
* Copyright 2017 NXP
*
*/
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* =====================================================================================
*
* Filename: playlist.c
*
* Description:
*
* Version: 1.0
* Created: 09/06/2009 02:17:20 PM
* Revision: none
* Compiler: gcc
*
* Author: Dr. Fritz Mehner (mn), mehner@fh-swf.de
* Company: FH Südwestfalen, Iserlohn
*
* Modified: Haihua Hu
* Date: 08/03/2015
* Company: Freescale Semiconductor
* =====================================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "playlist.h"
#define MEM_ALLOC(size) malloc((size))
#define MEM_FREE(ptr) free((ptr))
#define MEM_ZERO(ptr,size) memset((ptr),0,(size))
#define PL_ERR printf
typedef struct _PlayItemCtl
{
gchar *iName;
struct _PlayItemCtl *prev;
struct _PlayItemCtl *next;
} PlayItemCtl;
typedef struct _PlayList
{
PlayItemCtl *head;
PlayItemCtl *tail;
PlayItemCtl *cur;
} PlayList;
static void
destroyPlayItemCtl (PlayItemCtl * item)
{
if (item->iName)
MEM_FREE (item->iName);
MEM_FREE (item);
}
PlayListHandle
createPlayList ()
{
PlayList *pl = MEM_ALLOC (sizeof (PlayList));
if (pl == NULL) {
PL_ERR ("%s failed, no memory!\n", __FUNCTION__);
goto err;
}
MEM_ZERO (pl, sizeof (PlayList));
return (PlayListHandle) pl;
err:
if (pl) {
MEM_FREE (pl);
pl = NULL;
}
return (PlayListHandle) pl;
}
gint
isPlayListEmpty (PlayListHandle handle, gboolean * empty)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL || empty == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return RET_FAILURE;
}
if (!pl->head)
*empty = TRUE;
else
*empty = FALSE;
return RET_SUCCESS;
}
gint
addItemAtTail (PlayListHandle handle, gchar * iName)
{
PlayItemCtl *item = NULL;
PlayList *pl = (PlayList *) handle;
if ((pl == NULL) || (iName == NULL)) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
goto err;
}
item = MEM_ALLOC (sizeof (PlayItemCtl));
if (item == NULL) {
PL_ERR ("%s failed, no memory!\n", __FUNCTION__);
goto err;
}
MEM_ZERO (item, sizeof (PlayItemCtl));
item->iName = (gchar *) MEM_ALLOC (strlen (iName) + 1);
if (item->iName == NULL) {
PL_ERR ("%s failed, no memory!\n", __FUNCTION__);
goto err;
}
strcpy (item->iName, iName);
item->prev = pl->tail;
if (pl->head) {
pl->tail->next = item;
pl->tail = item;
} else {
pl->head = item;
pl->tail = item;
pl->cur = item;
}
return RET_SUCCESS;
err:
if (item) {
MEM_FREE (item);
item = NULL;
}
return RET_FAILURE;
}
const gchar *
getFirstItem (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return NULL;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return NULL;
}
pl->cur = pl->head;
return pl->head->iName;
}
const gchar *
getLastItem (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return NULL;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return NULL;
}
pl->cur = pl->tail;
return pl->tail->iName;
}
const gchar *
getCurItem (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return NULL;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return NULL;
}
return pl->cur->iName;
}
const gchar *
getPrevItem (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return NULL;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return NULL;
}
if (!pl->cur->prev) {
PL_ERR ("%s No previous item!\n", __FUNCTION__);
return NULL;
}
pl->cur = pl->cur->prev;
return pl->cur->iName;
}
const gchar *
getNextItem (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return NULL;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return NULL;
}
if (!pl->cur->next) {
PL_ERR ("%s No next item!\n", __FUNCTION__);
return NULL;
}
pl->cur = pl->cur->next;
return pl->cur->iName;
}
gint
isLastItem (PlayListHandle handle, gboolean * islast)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL || islast == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return RET_FAILURE;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return RET_FAILURE;
}
if (pl->cur == pl->tail) {
*islast = TRUE;
} else {
*islast = FALSE;
}
return RET_SUCCESS;
}
gint
isFirstItem (PlayListHandle handle, gboolean * isfirst)
{
PlayList *pl = (PlayList *) handle;
if (pl == NULL || isfirst == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return RET_FAILURE;
}
if (!pl->head) {
PL_ERR ("Play list is empty\n");
return RET_FAILURE;
}
if (pl->cur == pl->head) {
*isfirst = TRUE;
} else {
*isfirst = FALSE;
}
return RET_SUCCESS;
}
void
destroyPlayList (PlayListHandle handle)
{
PlayList *pl = (PlayList *) handle;
PlayItemCtl *item, *itemnext;
if (pl == NULL) {
PL_ERR ("%s failed, parameters error!\n", __FUNCTION__);
return;
}
item = pl->head;
while (item) {
itemnext = item->next;
destroyPlayItemCtl (item);
item = itemnext;
}
MEM_FREE (pl);
pl = NULL;
}