/* 
 * Copyright (c) 2007,2008 Wayne Meissner
 * 
 * This file is part of gstreamer-java.
 *
 * This code is free software: you can redistribute it and/or modify it under 
 * the terms of the GNU Lesser General Public License version 3 only, as
 * published by the Free Software Foundation.
 *
 * This code 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 Lesser General Public License 
 * version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with this work.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.freedesktop.gstreamer;

import static org.freedesktop.gstreamer.lowlevel.GstValueAPI.GSTVALUE_API;
import org.freedesktop.gstreamer.lowlevel.GValueAPI.GValue;

/**
 * Represents a fraction value.
 */
public class Fraction {
    public final int numerator;
    public final int denominator;
    
    /**
     * Creates a new {@code Fraction}.
     * 
     * @param numerator the numerator value.
     * @param denominator the denominator value.
     */
    public Fraction(int numerator, int denominator) {
        this.numerator = numerator;
        this.denominator = denominator;
    }
    
    /**
     * Gets the numerator of the {@code Fraction}
     * 
     * @return the numerator as an integer.
     */
    public int getNumerator() {
        return numerator;
    }
    
    /**
     * Gets the denominator of the {@code Fraction}
     * 
     * @return the denominator as an integer.
     */
    public int getDenominator() {
        return denominator;
    }
    
    /**
     * Returns the fraction as a floating point value (numerator divided by the denominator).
     * @return fraction as a <code>double</code>, or <code>Double.NaN</code> if the denominator is 0
     */
    public double toDouble() {
    	return denominator != 0 ? ((double) numerator / denominator) : Double.NaN;
    }
    
    public static Fraction objectFor(GValue value) {
    	if (GSTVALUE_API.gst_fraction_get_type().equals(value.getType())) {
    		return new Fraction(GSTVALUE_API.gst_value_get_fraction_numerator(value), GSTVALUE_API.gst_value_get_fraction_denominator(value));
    	}
    	return null;
    }
}
