Ticket #8088: 8088_playgroups_v17.patch

File 8088_playgroups_v17.patch, 112.4 KB (added by Jim Stichnoth <stichnot@…>, 15 years ago)
  • libs/libmythtv/videoout_vdpau.h

     
    2020{
    2121  public:
    2222    static void GetRenderOptions(render_opts &opts);
    23     VideoOutputVDPAU();
     23    VideoOutputVDPAU(PlaySettings *settings);
    2424    ~VideoOutputVDPAU();
    2525    bool Init(int width, int height, float aspect, WId winid,
    2626              int winx, int winy, int winw, int winh,
     
    5454                                    const QSize &video_dim);
    5555    static MythCodecID GetBestSupportedCodec(uint width, uint height,
    5656                                             uint stream_type,
    57                                              bool no_acceleration);
     57                                             bool no_acceleration,
     58                                             PlaySettings *settings);
    5859    virtual bool IsPIPSupported(void) const { return true; }
    5960    virtual bool IsPBPSupported(void) const { return false; }
    6061    virtual bool NeedExtraAudioDecode(void) const
  • libs/libmythtv/subtitlereader.h

     
    3333
    3434    TextSubtitles* GetTextSubtitles(void) { return &m_TextSubtitles; }
    3535    bool HasTextSubtitles(void);
    36     bool LoadExternalSubtitles(const QString &videoFile);
     36    bool LoadExternalSubtitles(const QString &videoFile, PlaySettings *settings);
    3737
    3838  private:
    3939    AVSubtitles   m_AVSubtitles;
  • libs/libmythtv/videooutwindow.cpp

     
    2929
    3030#include "videooutwindow.h"
    3131#include "osd.h"
     32#include "playsettings.h"
    3233#include "mythplayer.h"
    3334#include "videodisplayprofile.h"
    3435#include "decoderbase.h"
     
    5354const float VideoOutWindow::kManualZoomMinVerticalZoom   = 0.5f;
    5455const int   VideoOutWindow::kManualZoomMaxMove           = 50;
    5556
    56 VideoOutWindow::VideoOutWindow() :
     57VideoOutWindow::VideoOutWindow(PlaySettings *_settings) :
    5758    // DB settings
    5859    db_move(0, 0), db_scale_horiz(0.0f), db_scale_vert(0.0f),
    5960    db_pip_size(26),
     
    8485
    8586    // Various state variables
    8687    embedding(false), needrepaint(false),
    87     allowpreviewepg(true), pip_state(kPIPOff)
     88    allowpreviewepg(true), pip_state(kPIPOff),
     89
     90    settings(_settings)
    8891{
    8992    db_pip_size = gCoreContext->GetNumSetting("PIPSize", 26);
    9093
    91     db_move = QPoint(gCoreContext->GetNumSetting("xScanDisplacement", 0),
    92                      gCoreContext->GetNumSetting("yScanDisplacement", 0));
     94    db_move = QPoint(settings->GetNumSetting("xScanDisplacement", 0),
     95                     settings->GetNumSetting("yScanDisplacement", 0));
    9396    db_use_gui_size = gCoreContext->GetNumSetting("GuiSizeForTV", 0);
    9497
    9598    QDesktopWidget *desktop = NULL;
     
    612615    if (change)
    613616    {
    614617        db_scale_vert =
    615             gCoreContext->GetNumSetting("VertScanPercentage", 0) * 0.01f;
     618            settings->GetNumSetting("VertScanPercentage", 0) * 0.01f;
    616619        db_scale_horiz =
    617             gCoreContext->GetNumSetting("HorizScanPercentage", 0) * 0.01f;
     620            settings->GetNumSetting("HorizScanPercentage", 0) * 0.01f;
    618621        db_scaling_allowed = true;
    619622    }
    620623    else
  • libs/libmythtv/videoout_d3d.cpp

     
    5050    opts.priorities->insert("direct3d", 55);
    5151}
    5252
    53 VideoOutputD3D::VideoOutputD3D(void)
    54   : VideoOutput(),        m_lock(QMutex::Recursive),
     53VideoOutputD3D::VideoOutputD3D(PlaySettigns *settings)
     54  : VideoOutput(settings), m_lock(QMutex::Recursive),
    5555    m_hWnd(NULL),          m_render(NULL),
    5656    m_video(NULL),
    5757    m_render_valid(false), m_render_reset(false), m_pip_active(NULL),
  • libs/libmythtv/DetectLetterbox.cpp

     
    55#include "mythplayer.h"
    66#include "videoouttypes.h"
    77#include "mythcorecontext.h"
     8#include "playsettings.h"
    89
    910DetectLetterbox::DetectLetterbox(MythPlayer* const player)
    1011{
    11     int dbAdjustFill = gCoreContext->GetNumSetting("AdjustFill", 0);
     12    int dbAdjustFill = player->GetPlaySettings()->GetNumSetting("AdjustFill", 0);
    1213    isDetectLetterbox = dbAdjustFill >= kAdjustFill_AutoDetect_DefaultOff;
    1314    firstFrameChecked = 0;
    1415    detectLetterboxDefaultMode = (AdjustFillMode) max((int) kAdjustFill_Off,
     
    1819    detectLetterboxPossibleFullFrame = -1;
    1920    detectLetterboxConsecutiveCounter = 0;
    2021    detectLetterboxDetectedMode = player->GetAdjustFill();
    21     detectLetterboxLimit = gCoreContext->GetNumSetting("DetectLeterboxLimit", 75);
     22    detectLetterboxLimit =
     23        player->GetPlaySettings()->GetNumSetting("DetectLeterboxLimit", 75);
    2224    m_player = player;
    2325}
    2426
  • libs/libmythtv/videoout_opengl.cpp

     
    3535    opts.priorities->insert("opengl", 65);
    3636}
    3737
    38 VideoOutputOpenGL::VideoOutputOpenGL()
    39     : VideoOutput(),
     38VideoOutputOpenGL::VideoOutputOpenGL(PlaySettings *settings)
     39    : VideoOutput(settings),
    4040    gl_context_lock(QMutex::Recursive),
    4141    gl_context(NULL), gl_videochain(NULL), gl_pipchain_active(NULL),
    4242    gl_parent_win(0), gl_embed_win(0), gl_painter(NULL)
  • libs/libmythtv/videoout_quartz.cpp

     
    6363#include "mythverbose.h"
    6464#include "videodisplayprofile.h"
    6565
     66class PlaySettings;
     67
    6668#define LOC     QString("VideoOutputQuartz::")
    6769#define LOC_ERR QString("VideoOutputQuartz Error: ")
    6870
     
    11021104/** \class VideoOutputQuartz
    11031105 *  \brief Implementation of Quartz (Mac OS X windowing system) video output
    11041106 */
    1105 VideoOutputQuartz::VideoOutputQuartz() :
    1106     VideoOutput(), Started(false), data(new QuartzData())
     1107VideoOutputQuartz::VideoOutputQuartz(PlaySettings *settings) :
     1108    VideoOutput(settings), Started(false), data(new QuartzData())
    11071109{
    11081110    init(&pauseFrame, FMT_YV12, NULL, 0, 0, 0, 0);
    11091111}
     
    17531755MythCodecID VideoOutputQuartz::GetBestSupportedCodec(
    17541756    uint width, uint height,
    17551757    uint osd_width, uint osd_height,
    1756     uint stream_type, uint fourcc)
     1758    uint stream_type, uint fourcc, PlaySettings *settings)
    17571759{
    17581760    (void) osd_width;
    17591761    (void) osd_height;
    17601762
    1761     VideoDisplayProfile vdp;
     1763    VideoDisplayProfile vdp(settings);
    17621764    vdp.SetInput(QSize(width, height));
    17631765    QString dec = vdp.GetDecoder();
    17641766    if ((dec == "libmpeg2") || (dec == "ffmpeg"))
  • libs/libmythtv/avformatdecoder.cpp

     
    3131#include "BDRingBuffer.h"
    3232#include "videodisplayprofile.h"
    3333#include "mythuihelper.h"
     34#include "playsettings.h"
    3435
    3536#include "lcddevice.h"
    3637
     
    273274
    274275    cc608_build_parity_table(cc608_parity_table);
    275276
    276     if (gCoreContext->GetNumSetting("CCBackground", 0))
     277    if (GetPlayer()->GetPlaySettings()->GetNumSetting("CCBackground", 0))
    277278        CC708Window::forceWhiteOnBlackText = true;
    278279
    279280    no_dts_hack = false;
     
    11771178    if (selectedStream)
    11781179    {
    11791180        directrendering = true;
    1180         if (!gCoreContext->GetNumSetting("DecodeExtraAudio", 0) &&
     1181        if (!GetPlayer()->GetPlaySettings()->GetNumSetting("DecodeExtraAudio", 0) &&
    11811182            !CODEC_IS_HWACCEL(codec))
    11821183        {
    11831184            SetLowBuffers(false);
     
    16531654
    16541655                if (!is_db_ignored)
    16551656                {
    1656                     VideoDisplayProfile vdp;
     1657                    VideoDisplayProfile vdp(GetPlayer()->GetPlaySettings());
    16571658                    vdp.SetInput(QSize(width, height));
    16581659                    dec = vdp.GetDecoder();
    16591660                    thread_count = vdp.GetMaxCPUs();
     
    16811682                    MythCodecID vdpau_mcid;
    16821683                    vdpau_mcid = VideoOutputVDPAU::GetBestSupportedCodec(
    16831684                        width, height,
    1684                         mpeg_version(enc->codec_id), no_hardware_decoders);
     1685                        mpeg_version(enc->codec_id), no_hardware_decoders,
     1686                        GetPlayer()->GetPlaySettings());
    16851687
    16861688                    if (vdpau_mcid >= video_codec_id)
    16871689                    {
     
    17131715                        /* mpeg type    */ mpeg_version(enc->codec_id),
    17141716                        /* xvmc pix fmt */ xvmc_pixel_format(enc->pix_fmt),
    17151717                        /* test surface */ codec_is_std(video_codec_id),
    1716                         /* force_xv     */ force_xv);
     1718                        /* force_xv     */ force_xv,
     1719                        GetPlayer()->GetPlaySettings());
    17171720
    17181721                    if (mcid >= video_codec_id)
    17191722                    {
  • libs/libmythtv/playgroup.cpp

     
    11#include "mythdb.h"
    22#include "playgroup.h"
    33#include "programinfo.h"
     4#include "playsettings.h"
    45
    56// A parameter associated with the profile itself
    67class PlayGroupDBStorage : public SimpleDBStorage
     
    210211    return res;
    211212}
    212213
    213 PlayGroupEditor::PlayGroupEditor(void) :
    214     listbox(new ListBoxSetting(this)), lastValue("Default")
     214PlayGroupEditor::PlayGroupEditor(SettingsLookup *funcArray, int funcArraySize) :
     215    listbox(new ListBoxSetting(this)), lastValue("Default"),
     216    getSettings(funcArray), getSettingsSize(funcArraySize)
    215217{
    216218    listbox->setLabel(tr("Playback Groups"));
    217219    addChild(listbox);
     
    242244    }
    243245
    244246    PlayGroup group(name);
     247    PlaySettings *psettings = new PlaySettings(name);
     248    for (int i=0; i<getSettingsSize; i++)
     249        getSettings[i](psettings, &group);
    245250    if (group.exec() == QDialog::Accepted || !created)
    246251        lastValue = name;
    247252    else
     
    276281        query.bindValue(":NAME", name);
    277282        if (!query.exec())
    278283            MythDB::DBError("PlayGroupEditor::doDelete", query);
     284        PlaySettings::deleteGroup(name);
    279285
    280286        int lastIndex = listbox->getValueIndex(name);
    281287        lastValue = "";
  • libs/libmythtv/videoout_opengl.h

     
    1010{
    1111  public:
    1212    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    13     VideoOutputOpenGL();
     13    VideoOutputOpenGL(PlaySettings *settings);
    1414   ~VideoOutputOpenGL();
    1515
    1616    bool Init(int width, int height, float aspect, WId winid,
  • libs/libmythtv/tv_play.h

     
    5757class OSDListTreeItemEnteredEvent;
    5858class OSDListTreeItemSelectedEvent;
    5959struct osdInfo;
     60class PlaySettings;
    6061
    6162typedef QMap<QString,InfoMap>    DDValueMap;
    6263typedef QMap<QString,DDValueMap> DDKeyMap;
     
    180181        unsigned long seconds;
    181182    };
    182183
    183     TV(void);
     184    TV(PlaySettings *settings);
    184185   ~TV();
    185186
    186     void InitFromDB(void);
     187    void InitFromDB(PlaySettings *settings);
    187188    bool Init(bool createWindow = true);
    188189
    189190    // User input processing commands
     
    206207
    207208    // Recording commands
    208209    int  PlayFromRecorder(int recordernum);
    209     int  Playback(const ProgramInfo &rcinfo);
     210    int  Playback(const ProgramInfo &rcinfo, PlaySettings *settings);
    210211
    211212    // Commands used by frontend playback box
    212213    QString GetRecordingGroup(int player_idx) const;
  • libs/libmythtv/playgroup.h

     
    77#include "mythwidgets.h"
    88
    99class ProgramInfo;
     10class PlaySettings;
    1011
    1112class MPUBLIC PlayGroup: public ConfigurationWizard
    1213{
     
    2930    Q_OBJECT
    3031
    3132  public:
    32     PlayGroupEditor(void);
     33    typedef ConfigurationWizard *(*SettingsLookup)(PlaySettings *settings,
     34                                                   ConfigurationWizard *base);
     35    PlayGroupEditor(SettingsLookup *funcArray, int funcArraySize);
    3336    virtual DialogCode exec(void);
    3437    virtual void Load(void);
    3538    virtual void Save(void) { }
     
    4447  protected:
    4548    ListBoxSetting *listbox;
    4649    QString         lastValue;
     50    SettingsLookup *getSettings;
     51    int             getSettingsSize;
    4752};
    4853
    4954#endif
  • libs/libmythtv/dbcheck.cpp

     
    35563556
    35573557            VideoDisplayProfile::CreateNewProfiles(host);
    35583558            profiles = VideoDisplayProfile::GetProfiles(host);
    3559             QString profile = VideoDisplayProfile::GetDefaultProfileName(host);
     3559            QString profile =
     3560                VideoDisplayProfile::GetDefaultProfileName(host, NULL);
    35603561
    35613562            if (profiles.contains("Normal") &&
    35623563                (profile=="CPU++" || profile=="CPU+" || profile=="CPU--"))
     
    59375938"  jump int(11) NOT NULL default '0',"
    59385939"  PRIMARY KEY  (`name`)"
    59395940");",
     5941"CREATE TABLE playgroupsettings ("
     5942"  playgroupname varchar(64) NOT NULL,"
     5943"  `value` varchar(128) NOT NULL,"
     5944"  `data` text,"
     5945"  overridden tinyint(1) NOT NULL,"
     5946"  PRIMARY KEY (playgroupname, `value`)"
     5947");",
    59405948"CREATE TABLE powerpriority ("
    59415949"  priorityname varchar(64) collate utf8_bin NOT NULL,"
    59425950"  recpriority int(10) NOT NULL default '0',"
  • libs/libmythtv/videoout_vdpau.cpp

     
    4848    opts.deints->insert("vdpau", deints);
    4949}
    5050
    51 VideoOutputVDPAU::VideoOutputVDPAU()
    52   : m_win(0),                m_render(NULL),
     51VideoOutputVDPAU::VideoOutputVDPAU(PlaySettings *settings)
     52  : VideoOutput(settings), m_win(0),           m_render(NULL),
    5353    m_buffer_size(NUM_VDPAU_BUFFERS),          m_pause_surface(0),
    5454    m_need_deintrefs(false), m_video_mixer(0), m_mixer_features(kVDPFeatNone),
    5555    m_checked_surface_ownership(false),
     
    871871
    872872MythCodecID VideoOutputVDPAU::GetBestSupportedCodec(
    873873    uint width,       uint height,
    874     uint stream_type, bool no_acceleration)
     874    uint stream_type, bool no_acceleration, PlaySettings *settings)
    875875{
    876876    bool use_cpu = no_acceleration;
    877     VideoDisplayProfile vdp;
     877    VideoDisplayProfile vdp(settings);
    878878    vdp.SetInput(QSize(width, height));
    879879    QString dec = vdp.GetDecoder();
    880880
  • libs/libmythtv/videoout_directfb.cpp

     
    274274    opts.priorities->insert("directfb", 60);
    275275}
    276276
    277 VideoOutputDirectfb::VideoOutputDirectfb()
    278     : VideoOutput(), XJ_started(false), widget(NULL),
     277VideoOutputDirectfb::VideoOutputDirectfb(PlaySettings *settings)
     278    : VideoOutput(settings), XJ_started(false), widget(NULL),
    279279      data(new DirectfbData())
    280280{
    281281    init(&pauseFrame, FMT_YV12, NULL, 0, 0, 0, 0);
  • libs/libmythtv/mythplayer.h

     
    212212    QString   GetXDS(const QString &key) const;
    213213    PIPLocation GetNextPIPLocation(void) const;
    214214
     215    PlaySettings *GetPlaySettings(void) const {
     216        return player_ctx ? player_ctx->settings : NULL;
     217    }
     218
    215219    // Bool Gets
    216220    bool    GetRawAudioState(void) const;
    217221    bool    GetLimitKeyRepeat(void) const     { return limitKeyRepeat; }
  • libs/libmythtv/videoout_d3d.h

     
    1212{
    1313  public:
    1414    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    15     VideoOutputD3D();
     15    VideoOutputD3D(PlaySettings *settings);
    1616   ~VideoOutputD3D();
    1717
    1818    bool Init(int width, int height, float aspect, WId winid,
  • libs/libmythtv/playercontext.cpp

     
    1616#include "storagegroup.h"
    1717#include "mythcorecontext.h"
    1818#include "videometadatautil.h"
     19#include "DetectLetterbox.h"
     20#include "playsettings.h"
    1921
    2022#define LOC QString("playCtx: ")
    2123#define LOC_ERR QString("playCtx, Error: ")
     
    404406                                 WId embedwinid, const QRect *embedbounds,
    405407                                 bool muted)
    406408{
    407     int exact_seeking = gCoreContext->GetNumSetting("ExactSeeking", 0);
     409    int exact_seeking = settings->GetNumSetting("ExactSeeking", 0);
    408410
    409411    if (HasPlayer())
    410412    {
     
    447449    {
    448450        QString subfn = buffer->GetSubtitleFilename();
    449451        if (!subfn.isEmpty() && player->GetSubReader())
    450             player->GetSubReader()->LoadExternalSubtitles(subfn);
     452            player->GetSubReader()->LoadExternalSubtitles(subfn, settings);
    451453    }
    452454
    453455    if ((embedwinid > 0) && embedbounds)
     
    888890/**
    889891 * \brief assign programinfo to the context
    890892 */
    891 void PlayerContext::SetPlayingInfo(const ProgramInfo *info)
     893void PlayerContext::SetPlayingInfo(const ProgramInfo *info,
     894                                   PlaySettings *_settings)
    892895{
    893896    bool ignoreDB = gCoreContext->IsDatabaseIgnored();
    894897
     
    900903            playingInfo->MarkAsInUse(false, recUsage);
    901904        delete playingInfo;
    902905        playingInfo = NULL;
     906        // XXX delete settings?
    903907    }
    904908
    905909    if (info)
     
    908912        if (!ignoreDB)
    909913            playingInfo->MarkAsInUse(true, recUsage);
    910914        playingLen = playingInfo->GetSecondsInRecording();
     915        settings = (_settings ? _settings :
     916                    new PlaySettings(playingInfo->GetPlaybackGroup()));
    911917    }
    912918}
    913919
  • libs/libmythtv/subtitlereader.cpp

     
    5656        av_free(subtitle.rects);
    5757}
    5858
    59 bool SubtitleReader::LoadExternalSubtitles(const QString &subtitleFileName)
     59bool SubtitleReader::LoadExternalSubtitles(const QString &subtitleFileName,
     60                                           PlaySettings *settings)
    6061{
    6162    m_TextSubtitles.Clear();
    62     return TextSubtitleParser::LoadSubtitles(subtitleFileName, m_TextSubtitles);
     63    return TextSubtitleParser::LoadSubtitles(subtitleFileName, m_TextSubtitles,
     64                                             settings);
    6365}
    6466
    6567bool SubtitleReader::HasTextSubtitles(void)
  • libs/libmythtv/textsubtitleparser.h

     
    1717// Qt headers
    1818#include <QStringList>
    1919
     20class PlaySettings;
     21
    2022class text_subtitle_t
    2123{
    2224  public:
     
    7981class TextSubtitleParser
    8082{
    8183  public:
    82     static bool LoadSubtitles(QString fileName, TextSubtitles &target);
     84    static bool LoadSubtitles(QString fileName, TextSubtitles &target,
     85                              PlaySettings *settings);
    8386};
    8487
    8588#endif
  • libs/libmythtv/vsync.cpp

     
    3434
    3535#include "mythcontext.h"
    3636#include "mythmainwindow.h"
     37#include "playsettings.h"
    3738
    3839#ifdef USING_XV
    3940#include "videoout_xv.h"
     
    7879 *  \brief Returns the most sophisticated video sync method available.
    7980 */
    8081VideoSync *VideoSync::BestMethod(VideoOutput *video_output,
     82                                 PlaySettings *settings,
    8183                                 uint frame_interval, uint refresh_interval,
    8284                                 bool halve_frame_interval)
    8385{
     
    102104#ifndef _WIN32
    103105    TESTVIDEOSYNC(DRMVideoSync);
    104106#ifdef USING_OPENGL_VSYNC
    105     if (gCoreContext->GetNumSetting("UseOpenGLVSync", 1) &&
     107    if (settings->GetNumSetting("UseOpenGLVSync", 1) &&
    106108       (getenv("NO_OPENGL_VSYNC") == NULL))
    107109    {
    108110        TESTVIDEOSYNC(OpenGLVideoSync);
  • libs/libmythtv/tv_play.cpp

     
    5757#include "mythsystemevent.h"
    5858#include "videometadatautil.h"
    5959#include "mythdialogbox.h"
     60#include "playsettings.h"
    6061
    6162#if ! HAVE_ROUND
    6263#define round(x) ((int) ((x) + 0.5))
     
    207208    bool startInGuide = flags & kStartTVInGuide;
    208209    bool inPlaylist = flags & kStartTVInPlayList;
    209210    bool initByNetworkCommand = flags & kStartTVByNetworkCommand;
    210     TV *tv = new TV();
    211211    bool quitAll = false;
    212212    bool showDialogs = true;
    213213    bool playCompleted = false;
     
    221221        curProgram->SetIgnoreBookmark(flags & kStartTVIgnoreBookmark);
    222222    }
    223223
     224    PlaySettings settings(curProgram ? curProgram->GetPlaybackGroup() : "Default");
     225    TV *tv = new TV(&settings);
     226
    224227    // Initialize TV
    225228    if (!tv->Init())
    226229    {
     
    251254        if (curProgram)
    252255        {
    253256            VERBOSE(VB_PLAYBACK, LOC + "tv->Playback() -- begin");
    254             if (!tv->Playback(*curProgram))
     257            if (!tv->Playback(*curProgram, &settings))
    255258            {
    256259                quitAll = true;
    257260            }
     
    832835class TVInitRunnable : public QRunnable
    833836{
    834837  public:
    835     TVInitRunnable(TV *ourTV) : tv(ourTV) {}
    836     virtual void run(void) { tv->InitFromDB(); }
     838    TVInitRunnable(TV *ourTV, PlaySettings *ourSettings) :
     839        tv(ourTV), settings(ourSettings) {}
     840    virtual void run(void) { tv->InitFromDB(settings); }
    837841    TV *tv;
     842    PlaySettings *settings;
    838843};
    839844
    840845/** \fn TV::TV(void)
    841846 *  \sa Init(void)
    842847 */
    843 TV::TV(void)
     848TV::TV(PlaySettings *settings)
    844849    : // Configuration variables from database
    845850      baseFilters(""),
    846851      db_channel_format("<num> <sign>"),
     
    939944    playerActive = 0;
    940945    playerLock.unlock();
    941946
    942     QThreadPool::globalInstance()->start(new TVInitRunnable(this), 99);
     947    QThreadPool::globalInstance()->start(new TVInitRunnable(this, settings), 99);
    943948
    944949    VERBOSE(VB_PLAYBACK, LOC + "ctor -- end");
    945950}
    946951
    947 void TV::InitFromDB(void)
     952void TV::InitFromDB(PlaySettings *settings)
    948953{
    949954    QMap<QString,QString> kv;
    950955    kv["LiveTVIdleTimeout"]        = "0";
     
    989994        kv[QString("FFRewSpeed%1").arg(i)] = QString::number(ff_rew_def[i]);
    990995
    991996    MythDB::getMythDB()->GetSettings(kv);
     997    settings->AddToMap(kv);
    992998
    993999    // convert from minutes to ms.
    9941000    db_idle_timeout        = kv["LiveTVIdleTimeout"].toInt() * 60 * 1000;
     
    17241730    askAllowLock.unlock();
    17251731}
    17261732
    1727 int TV::Playback(const ProgramInfo &rcinfo)
     1733int TV::Playback(const ProgramInfo &rcinfo, PlaySettings *settings)
    17281734{
    17291735    wantsToQuit   = false;
    17301736    jumpToProgram = false;
     
    17381744        return 0;
    17391745    }
    17401746
    1741     mctx->SetPlayingInfo(&rcinfo);
     1747    mctx->SetPlayingInfo(&rcinfo, settings);
    17421748    mctx->SetInitialTVState(false);
    17431749    ScheduleStateChange(mctx);
    17441750
     
    18211827
    18221828    if (fileexists)
    18231829    {
    1824         Playback(pginfo);
     1830        PlaySettings settings("Default");
     1831        Playback(pginfo, &settings);
    18251832        retval = 1;
    18261833    }
    18271834
     
    21622169            QString msg = tr("%1 Settings")
    21632170                    .arg(tv_i18n(ctx->playingInfo->GetPlaybackGroup()));
    21642171            ctx->UnlockPlayingInfo(__FILE__, __LINE__);
    2165             if (count > 0)
     2172            if (count > 0 &&
     2173                ctx->playingInfo->GetPlaybackGroup() != "Default" &&
     2174                ctx->playingInfo->GetPlaybackGroup() != "Videos")
    21662175                SetOSDMessage(ctx, msg);
    21672176            ITVRestart(ctx, false);
    21682177        }
  • libs/libmythtv/videodisplayprofile.h

     
    1313
    1414#include "mythcontext.h"
    1515
     16class PlaySettings;
     17
    1618typedef QMap<QString,QString>     pref_map_t;
    1719typedef QMap<QString,QStringList> safe_map_t;
    1820typedef QStringList               safe_list_t;
     
    8082class MPUBLIC VideoDisplayProfile
    8183{
    8284  public:
    83     VideoDisplayProfile();
     85    VideoDisplayProfile(PlaySettings *settings);
    8486    ~VideoDisplayProfile();
    8587
    8688    void SetInput(const QSize &size);
     
    124126    static QString     GetDecoderName(const QString &decoder);
    125127    static QString     GetDecoderHelp(QString decoder = QString::null);
    126128
    127     static QString     GetDefaultProfileName(const QString &hostname);
     129    static QString     GetDefaultProfileName(const QString &hostname,
     130                                             PlaySettings *settings);
    128131    static void        SetDefaultProfileName(const QString &profilename,
    129132                                             const QString &hostname);
    130133    static uint        GetProfileGroupID(const QString &profilename,
  • libs/libmythtv/videoout_null.cpp

     
    2727    opts.priorities->insert("null", 10);
    2828}
    2929
    30 VideoOutputNull::VideoOutputNull() :
    31     VideoOutput(), global_lock(QMutex::Recursive)
     30VideoOutputNull::VideoOutputNull(PlaySettings *settings) :
     31    VideoOutput(settings), global_lock(QMutex::Recursive)
    3232{
    3333    VERBOSE(VB_PLAYBACK, "VideoOutputNull()");
    3434    memset(&av_pause_frame, 0, sizeof(av_pause_frame));
  • libs/libmythtv/videooutbase.cpp

     
    77#include "mythplayer.h"
    88#include "videodisplayprofile.h"
    99#include "decoderbase.h"
     10#include "playsettings.h"
    1011
    1112#include "mythcorecontext.h"
    1213#include "mythverbose.h"
     
    109110        PIPState pipState,
    110111        const QSize   &video_dim, float        video_aspect,
    111112        WId            win_id,    const QRect &display_rect,
    112         float          video_prate,     WId    embed_id)
     113        float          video_prate,     WId    embed_id,
     114        PlaySettings *settings)
    113115{
    114116    (void) codec_priv;
    115117
     
    154156    QString renderer = QString::null;
    155157    if (renderers.size() > 0)
    156158    {
    157         VideoDisplayProfile vprof;
     159        VideoDisplayProfile vprof(settings);
    158160        vprof.SetInput(video_dim);
    159161
    160162        QString tmp = vprof.GetVideoRenderer();
     
    182184
    183185#ifdef USING_DIRECTFB
    184186        if (renderer == "directfb")
    185             vo = new VideoOutputDirectfb();
     187            vo = new VideoOutputDirectfb(settings);
    186188#endif // USING_DIRECTFB
    187189
    188190#ifdef USING_MINGW
    189191        if (renderer == "direct3d")
    190             vo = new VideoOutputD3D();
     192            vo = new VideoOutputD3D(settings);
    191193#endif // USING_MINGW
    192194
    193195#ifdef USING_QUARTZ_VIDEO
    194196        if (osxlist.contains(renderer))
    195             vo = new VideoOutputQuartz();
     197            vo = new VideoOutputQuartz(settings);
    196198#endif // Q_OS_MACX
    197199
    198200#ifdef USING_OPENGL_VIDEO
    199201        if (renderer == "opengl")
    200             vo = new VideoOutputOpenGL();
     202            vo = new VideoOutputOpenGL(settings);
    201203#endif // USING_OPENGL_VIDEO
    202204
    203205#ifdef USING_VDPAU
    204206        if (renderer == "vdpau")
    205             vo = new VideoOutputVDPAU();
     207            vo = new VideoOutputVDPAU(settings);
    206208#endif // USING_VDPAU
    207209
    208210#ifdef USING_XV
    209211        if (xvlist.contains(renderer))
    210             vo = new VideoOutputXv();
     212            vo = new VideoOutputXv(settings);
    211213#endif // USING_XV
    212214
    213215        if (vo)
     
    305307 * \brief This constructor for VideoOutput must be followed by an
    306308 *        Init(int,int,float,WId,int,int,int,int,WId) call.
    307309 */
    308 VideoOutput::VideoOutput() :
     310VideoOutput::VideoOutput(PlaySettings *_settings) :
    309311    // DB Settings
    310312    db_display_dim(0,0),
    311313    db_aspectoverride(kAspect_Off),     db_adjustfill(kAdjustFill_Off),
     
    345347    monitor_sz(640,480),                monitor_dim(400,300),
    346348
    347349    // OSD
    348     osd_painter(NULL),                  osd_image(NULL)
     350    osd_painter(NULL),                  osd_image(NULL),
     351    settings(_settings)
    349352
    350353{
    351354    bzero(&pip_tmp_image, sizeof(pip_tmp_image));
    352     db_display_dim = QSize(gCoreContext->GetNumSetting("DisplaySizeWidth",  0),
    353                            gCoreContext->GetNumSetting("DisplaySizeHeight", 0));
     355    db_display_dim = QSize(settings->GetNumSetting("DisplaySizeWidth",  0),
     356                           settings->GetNumSetting("DisplaySizeHeight", 0));
    354357
    355358    db_pict_attr[kPictureAttribute_Brightness] =
    356         gCoreContext->GetNumSetting("PlaybackBrightness", 50);
     359        settings->GetNumSetting("PlaybackBrightness", 50);
    357360    db_pict_attr[kPictureAttribute_Contrast] =
    358         gCoreContext->GetNumSetting("PlaybackContrast",   50);
     361        settings->GetNumSetting("PlaybackContrast",   50);
    359362    db_pict_attr[kPictureAttribute_Colour] =
    360         gCoreContext->GetNumSetting("PlaybackColour",     50);
     363        settings->GetNumSetting("PlaybackColour",     50);
    361364    db_pict_attr[kPictureAttribute_Hue] =
    362         gCoreContext->GetNumSetting("PlaybackHue",         0);
     365        settings->GetNumSetting("PlaybackHue",         0);
    363366
    364367    db_aspectoverride = (AspectOverrideMode)
    365         gCoreContext->GetNumSetting("AspectOverride",      0);
     368        settings->GetNumSetting("AspectOverride",      0);
    366369    db_adjustfill = (AdjustFillMode)
    367         gCoreContext->GetNumSetting("AdjustFill",          0);
     370        settings->GetNumSetting("AdjustFill",          0);
    368371    db_letterbox_colour = (LetterBoxColour)
    369         gCoreContext->GetNumSetting("LetterboxColour",     0);
     372        settings->GetNumSetting("LetterboxColour",     0);
    370373    db_use_picture_controls =
    371         gCoreContext->GetNumSetting("UseOutputPictureControls", 0);
     374        settings->GetNumSetting("UseOutputPictureControls", 0);
    372375
    373376    if (!gCoreContext->IsDatabaseIgnored())
    374         db_vdisp_profile = new VideoDisplayProfile();
     377        db_vdisp_profile = new VideoDisplayProfile(settings);
    375378
    376     windows.push_back(VideoOutWindow());
     379    windows.push_back(VideoOutWindow(settings));
    377380}
    378381
    379382/**
     
    449452    return QString::null;
    450453}
    451454
    452 bool VideoOutput::IsPreferredRenderer(QSize video_size)
     455bool VideoOutput::IsPreferredRenderer(QSize video_size, PlaySettings *settings)
    453456{
    454457    if (!db_vdisp_profile || (video_size == windows[0].GetVideoDispDim()))
    455458        return true;
    456459
    457     VideoDisplayProfile vdisp;
     460    VideoDisplayProfile vdisp(settings);
    458461    vdisp.SetInput(video_size);
    459462    QString new_rend = vdisp.GetVideoRenderer();
    460463    if (new_rend.isEmpty())
  • libs/libmythtv/videooutwindow.h

     
    1616#include "videoouttypes.h"
    1717
    1818class MythPlayer;
     19class PlaySettings;
    1920
    2021class VideoOutWindow
    2122{
    2223  public:
    23     VideoOutWindow();
     24    VideoOutWindow(PlaySettings *settings);
    2425
    2526    bool Init(const QSize &new_video_dim, float aspect,
    2627              const QRect &new_display_visible_rect,
     
    162163    bool     allowpreviewepg;
    163164    PIPState pip_state;
    164165
     166    PlaySettings *settings;
     167
    165168    // Constants
    166169    static const float kManualZoomMaxHorizontalZoom;
    167170    static const float kManualZoomMaxVerticalZoom;
  • libs/libmythtv/videoout_directfb.h

     
    1212{
    1313  public:
    1414    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    15     VideoOutputDirectfb();
     15    VideoOutputDirectfb(PlaySettings *settings);
    1616    ~VideoOutputDirectfb();
    1717
    1818    bool Init(int width, int height, float aspect, WId winid,
  • libs/libmythtv/playercontext.h

     
    2828class LiveTVChain;
    2929class MythDialog;
    3030class QPainter;
     31class PlaySettings;
    3132
    3233struct osdInfo
    3334{
     
    112113    void SetRecorder(RemoteEncoder *rec);
    113114    void SetTVChain(LiveTVChain *chain);
    114115    void SetRingBuffer(RingBuffer *buf);
    115     void SetPlayingInfo(const ProgramInfo *info);
     116    void SetPlayingInfo(const ProgramInfo *info, PlaySettings *settings=NULL);
    116117    void SetPlayGroup(const QString &group);
    117118    void SetPseudoLiveTV(const ProgramInfo *pi, PseudoState new_state);
    118119    void SetPIPLocation(int loc) { pipLocation = loc; }
     
    168169    LiveTVChain        *tvchain;
    169170    RingBuffer         *buffer;
    170171    ProgramInfo        *playingInfo; ///< Currently playing info
     172    PlaySettings       *settings; // corresponding to playingInfo
    171173    long long           playingLen;  ///< Initial CalculateLength()
    172174    bool                nohardwaredecoders; // < Disable use of VDPAU decoding
    173175    int                 last_cardid; ///< CardID of current/last recorder
  • libs/libmythtv/vsync.h

     
    8787
    8888    // documented in vsync.cpp
    8989    static VideoSync *BestMethod(VideoOutput*,
     90                                 PlaySettings *settings,
    9091                                 uint frame_interval, uint refresh_interval,
    9192                                 bool interlaced);
    9293  protected:
  • libs/libmythtv/videoout_xv.h

     
    5151    friend class XvMCOSD;
    5252  public:
    5353    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    54     VideoOutputXv();
     54    VideoOutputXv(PlaySettings *settings);
    5555   ~VideoOutputXv();
    5656
    5757    bool Init(int width, int height, float aspect, WId winid,
     
    109109    static MythCodecID GetBestSupportedCodec(uint width, uint height,
    110110                                             uint osd_width, uint osd_height,
    111111                                             uint stream_type, int xvmc_chroma,
    112                                              bool test_surface, bool force_xv);
     112                                             bool test_surface, bool force_xv,
     113                                             PlaySettings *settings);
    113114
    114115    static int GrabSuitableXvPort(MythXDisplay* disp, Window root,
     116                                  PlaySettings *settings,
    115117                                  MythCodecID type,
    116118                                  uint width, uint height,
    117119                                  bool &xvsetdefaults,
  • libs/libmythtv/videoout_xv.cpp

     
    165165 * \see VideoOutput, VideoBuffers
    166166 *
    167167 */
    168 VideoOutputXv::VideoOutputXv()
    169     : VideoOutput(),
     168VideoOutputXv::VideoOutputXv(PlaySettings *settings)
     169    : VideoOutput(settings),
    170170      video_output_subtype(XVUnknown),
    171171      global_lock(QMutex::Recursive),
    172172
     
    390390 * \return port number if it succeeds, else -1.
    391391 */
    392392int VideoOutputXv::GrabSuitableXvPort(MythXDisplay* disp, Window root,
     393                                      PlaySettings *settings,
    393394                                      MythCodecID mcodecid,
    394395                                      uint width, uint height,
    395396                                      bool &xvsetdefaults,
     
    474475    }
    475476
    476477    // figure out if we want chromakeying..
    477     VideoDisplayProfile vdp;
     478    VideoDisplayProfile vdp(settings);
    478479    vdp.SetInput(QSize(width, height));
    479480    bool check_for_colorkey = (vdp.GetOSDRenderer() == "chromakey");
    480481
     
    763764    disp->StartLog();
    764765    QString adaptor_name = QString::null;
    765766    const QSize video_dim = windows[0].GetVideoDim();
    766     xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), video_codec_id,
     767    xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), settings, video_codec_id,
    767768                                 video_dim.width(), video_dim.height(),
    768769                                 xv_set_defaults,
    769770                                 xvmc_chroma, &xvmc_surf_info, &adaptor_name);
     
    842843    disp->StartLog();
    843844    QString adaptor_name = QString::null;
    844845    const QSize video_dim = windows[0].GetVideoDim();
    845     xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), kCodec_MPEG2,
     846    xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), settings, kCodec_MPEG2,
    846847                                 video_dim.width(), video_dim.height(),
    847848                                 xv_set_defaults, 0, NULL, &adaptor_name);
    848849    if (xv_port == -1)
     
    996997    uint width,       uint height,
    997998    uint osd_width,   uint osd_height,
    998999    uint stream_type, int xvmc_chroma,
    999     bool test_surface, bool force_xv)
     1000    bool test_surface, bool force_xv,
     1001    PlaySettings *settings)
    10001002{
    10011003    (void)width, (void)height, (void)osd_width, (void)osd_height;
    10021004    (void)stream_type, (void)xvmc_chroma, (void)test_surface;
     
    10071009        return ret;
    10081010
    10091011#ifdef USING_XVMC
    1010     VideoDisplayProfile vdp;
     1012    VideoDisplayProfile vdp(settings);
    10111013    vdp.SetInput(QSize(width, height));
    10121014    QString dec = vdp.GetDecoder();
    10131015    if ((dec == "libmpeg2") || (dec == "ffmpeg"))
     
    10571059
    10581060        ok = false;
    10591061        bool dummy;
    1060         int port = GrabSuitableXvPort(disp, disp->GetRoot(), ret, width, height,
     1062        int port = GrabSuitableXvPort(disp, disp->GetRoot(), settings,
     1063                                      ret, width, height,
    10611064                                      dummy, xvmc_chroma, &info);
    10621065        if (port >= 0)
    10631066        {
  • libs/libmythtv/mythplayer.cpp

     
    6161#include "mythpainter.h"
    6262#include "mythimage.h"
    6363#include "mythuiimage.h"
     64#include "playsettings.h"
    6465
    6566extern "C" {
    6667#include "vbitext/vbi.h"
     
    246247      output_jmeter(NULL)
    247248{
    248249    playerThread = QThread::currentThread();
    249     // Playback (output) zoom control
    250     detect_letter_box = new DetectLetterbox(this);
    251250
    252     vbimode = VBIMode::Parse(gCoreContext->GetSetting("VbiFormat"));
    253     decode_extra_audio = gCoreContext->GetNumSetting("DecodeExtraAudio", 0);
    254     itvEnabled         = gCoreContext->GetNumSetting("EnableMHEG", 0);
    255     db_prefer708       = gCoreContext->GetNumSetting("Prefer708Captions", 1);
    256 
    257251    bzero(&tc_lastval, sizeof(tc_lastval));
    258252    bzero(&tc_wrap,    sizeof(tc_wrap));
    259253
     
    485479    if (using_null_videoout && GetDecoder())
    486480    {
    487481        MythCodecID codec = GetDecoder()->GetVideoCodecID();
    488         videoOutput = new VideoOutputNull();
     482        videoOutput = new VideoOutputNull(GetPlaySettings());
    489483        if (!videoOutput->Init(video_disp_dim.width(), video_disp_dim.height(),
    490484                               video_aspect, 0, 0, 0, 0, 0, codec, 0))
    491485        {
     
    535529                pipState,
    536530                video_disp_dim, video_aspect,
    537531                widget->winId(), display_rect, (video_frame_rate * play_speed),
    538                 0 /*embedid*/);
     532                0 /*embedid*/, GetPlaySettings());
    539533        }
    540534
    541535        if (videoOutput)
     
    629623
    630624void MythPlayer::ReinitVideo(void)
    631625{
    632     if (!videoOutput->IsPreferredRenderer(video_disp_dim))
     626    if (!videoOutput->IsPreferredRenderer(video_disp_dim, GetPlaySettings()))
    633627    {
    634628        VERBOSE(VB_PLAYBACK, LOC + QString("Need to switch video renderer."));
    635629        SetErrored(QObject::tr("Need to switch video renderer."));
     
    19481942        }
    19491943#endif // USING_MHEG
    19501944
    1951         SetCaptionsEnabled(gCoreContext->GetNumSetting("DefaultCCMode"), false);
     1945        SetCaptionsEnabled(GetPlaySettings()->GetNumSetting("DefaultCCMode", 0),
     1946                           false);
    19521947    }
    19531948
    19541949    SetPlaying(true);
     
    19941989        m_double_process = videoOutput->IsExtraProcessingRequired();
    19951990
    19961991        videosync = VideoSync::BestMethod(
    1997             videoOutput, fr_int, rf_int, m_double_framerate);
     1992            videoOutput, GetPlaySettings(),
     1993            fr_int, rf_int, m_double_framerate);
    19981994
    19991995        // Make sure video sync can do it
    20001996        if (videosync != NULL && m_double_framerate)
     
    23572353    if (bookmarkseek > 30)
    23582354    {
    23592355        DoFastForward(bookmarkseek, true, false);
    2360         if (gCoreContext->GetNumSetting("ClearSavedPosition", 1) &&
     2356        if (GetPlaySettings()->GetNumSetting("ClearSavedPosition", 1) &&
    23612357            !player_ctx->IsPIP())
    23622358        {
    23632359            ClearBookmark(false);
     
    25632559    {
    25642560        if (jumpto == totalFrames)
    25652561        {
    2566             if (!(gCoreContext->GetNumSetting("EndOfRecordingExitPrompt") == 1
     2562            if (!(GetPlaySettings()->GetNumSetting("EndOfRecordingExitPrompt", 0) == 1
    25672563                  && !player_ctx->IsPIP() &&
    25682564                  player_ctx->GetState() == kState_WatchingPreRecorded))
    25692565            {
     
    28312827        return kPIP_END;
    28322828
    28332829    if (pip_players.isEmpty())
    2834         return (PIPLocation)gCoreContext->GetNumSetting("PIPLocation", kPIPTopLeft);
     2830        return (PIPLocation)GetPlaySettings()->GetNumSetting("PIPLocation",
     2831                                                             kPIPTopLeft);
    28352832
    28362833    // order of preference, could be stored in db if we want it configurable
    28372834    PIPLocation ols[] =
     
    33373334    exactseeks   = frame_exact_seek;
    33383335    player_ctx   = ctx;
    33393336    livetv       = ctx->tvchain;
     3337
     3338    vbimode = VBIMode::Parse(GetPlaySettings()->GetSetting("VbiFormat", ""));
     3339
     3340    // Playback (output) zoom control
     3341    detect_letter_box = new DetectLetterbox(this);
     3342
     3343    decode_extra_audio = GetPlaySettings()->GetNumSetting("DecodeExtraAudio", 0);
     3344    itvEnabled = GetPlaySettings()->GetNumSetting("EnableMHEG", 0);
     3345    db_prefer708 = GetPlaySettings()->GetNumSetting("Prefer708Captions", 1);
    33403346}
    33413347
    33423348bool MythPlayer::EnableEdit(void)
  • libs/libmythtv/videooutbase.h

     
    3232class FilterChain;
    3333class FilterManager;
    3434class OpenGLContextGLX;
     35class PlaySettings;
    3536
    3637typedef QMap<MythPlayer*,PIPLocation> PIPMap;
    3738
     
    5253        PIPState       pipState,
    5354        const QSize   &video_dim, float        video_aspect,
    5455        WId            win_id,    const QRect &display_rect,
    55         float video_prate,        WId          embed_id);
     56        float video_prate,        WId          embed_id,
     57        PlaySettings *settings);
    5658
    57     VideoOutput();
     59    VideoOutput(PlaySettings *settings);
    5860    virtual ~VideoOutput();
    5961
    6062    virtual bool Init(int width, int height, float aspect,
     
    6264                      int winh, MythCodecID codec_id, WId embedid = 0);
    6365    virtual void InitOSD(OSD *osd);
    6466    virtual void SetVideoFrameRate(float);
    65     virtual bool IsPreferredRenderer(QSize video_size);
     67    virtual bool IsPreferredRenderer(QSize video_size, PlaySettings *settings);
    6668    virtual bool SetDeinterlacingEnabled(bool);
    6769    virtual bool SetupDeinterlace(bool i, const QString& ovrf="");
    6870    virtual void FallbackDeint(void);
     
    338340    // OSD painter and surface
    339341    MythYUVAPainter *osd_painter;
    340342    MythImage       *osd_image;
     343
     344    PlaySettings *settings;
    341345};
    342346
    343347#endif
  • libs/libmythtv/textsubtitleparser.cpp

     
    2121#include "RingBuffer.h"
    2222#include "textsubtitleparser.h"
    2323#include "xine_demux_sputext.h"
     24#include "playsettings.h"
    2425
    2526bool operator<(const text_subtitle_t& left,
    2627               const text_subtitle_t& right)
     
    116117    m_lock.unlock();
    117118}
    118119
    119 bool TextSubtitleParser::LoadSubtitles(QString fileName, TextSubtitles &target)
     120bool TextSubtitleParser::LoadSubtitles(QString fileName, TextSubtitles &target,
     121                                       PlaySettings *settings)
    120122{
    121123    demux_sputext_t sub_data;
    122124    sub_data.rbuffer = new RingBuffer(fileName, 0, false);
     
    134136    target.SetFrameBasedTiming(!sub_data.uses_time);
    135137
    136138    QTextCodec *textCodec = NULL;
    137     QString codec = gCoreContext->GetSetting("SubtitleCodec", "");
     139    QString codec = settings->GetSetting("SubtitleCodec", "");
    138140    if (!codec.isEmpty())
    139141        textCodec = QTextCodec::codecForName(codec.toLatin1());
    140142    if (!textCodec)
  • libs/libmythtv/subtitlescreen.cpp

     
    77#include "mythuiimage.h"
    88#include "mythpainter.h"
    99#include "subtitlescreen.h"
     10#include "playsettings.h"
    1011
    1112#define LOC      QString("Subtitles: ")
    1213#define LOC_WARN QString("Subtitles Warning: ")
     
    6263        VERBOSE(VB_IMPORTANT, LOC_WARN + "Failed to get CEA-608 reader.");
    6364    if (!m_708reader)
    6465        VERBOSE(VB_IMPORTANT, LOC_WARN + "Failed to get CEA-708 reader.");
    65     m_useBackground = (bool)gCoreContext->GetNumSetting("CCBackground", 0);
    66     m_708fontZoom   = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
     66    m_useBackground = (bool)m_player->GetPlaySettings()->GetNumSetting("CCBackground", 0);
     67    m_708fontZoom   = m_player->GetPlaySettings()->GetNumSetting("OSDCC708TextZoom", 100);
    6768    return true;
    6869}
    6970
  • libs/libmythtv/videoout_quartz.h

     
    22#define VIDEOOUT_QUARTZ_H_
    33
    44struct QuartzData;
     5class PlaySettings;
    56
    67#include "videooutbase.h"
    78
     
    910{
    1011  public:
    1112    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    12     VideoOutputQuartz();
     13    VideoOutputQuartz(PlaySettings *settings);
    1314   ~VideoOutputQuartz();
    1415
    1516    bool Init(int width, int height, float aspect, WId winid,
     
    5253    static MythCodecID GetBestSupportedCodec(
    5354        uint width, uint height,
    5455        uint osd_width, uint osd_height,
    55         uint stream_type, uint fourcc);
     56        uint stream_type, uint fourcc, PlaySettings *settings);
    5657    virtual bool NeedExtraAudioDecode(void) const
    5758        { return !codec_is_std(video_codec_id); }
    5859
  • libs/libmythtv/videodisplayprofile.cpp

     
    88#include "mythverbose.h"
    99#include "videooutbase.h"
    1010#include "avformatdecoder.h"
     11#include "playsettings.h"
    1112
    1213bool ProfileItem::IsMatch(const QSize &size, float rate) const
    1314{
     
    212213pref_map_t  VideoDisplayProfile::dec_name;
    213214safe_list_t VideoDisplayProfile::safe_decoders;
    214215
    215 VideoDisplayProfile::VideoDisplayProfile()
     216VideoDisplayProfile::VideoDisplayProfile(PlaySettings *settings)
    216217    : lock(QMutex::Recursive), last_size(0,0), last_rate(0.0f),
    217218      last_video_renderer(QString::null)
    218219{
     
    220221    init_statics();
    221222
    222223    QString hostname    = gCoreContext->GetHostName();
    223     QString cur_profile = GetDefaultProfileName(hostname);
     224    QString cur_profile = GetDefaultProfileName(hostname, settings);
    224225    uint    groupid     = GetProfileGroupID(cur_profile, hostname);
    225226
    226227    item_list_t items = LoadDB(groupid);
     
    772773    return list;
    773774}
    774775
    775 QString VideoDisplayProfile::GetDefaultProfileName(const QString &hostname)
     776QString VideoDisplayProfile::GetDefaultProfileName(const QString &hostname,
     777                                                   PlaySettings *settings)
    776778{
    777779    QString tmp =
     780        settings ? settings->GetSetting("DefaultVideoPlaybackProfile", "") :
    778781        gCoreContext->GetSettingOnHost("DefaultVideoPlaybackProfile", hostname);
    779782
    780783    QStringList profiles = GetProfiles(hostname);
  • libs/libmythtv/videoout_null.h

     
    99{
    1010  public:
    1111    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    12     VideoOutputNull();
     12    VideoOutputNull(PlaySettings *settings);
    1313   ~VideoOutputNull();
    1414
    1515    bool Init(int width, int height, float aspect, WId winid,
  • libs/libmyth/settings.cpp

     
    235235    return -1;
    236236}
    237237
     238QString SelectSetting::GetValueLabel(const QString &value)
     239{
     240    selectionList::const_iterator iterValues = values.begin();
     241    selectionList::const_iterator iterLabels = labels.begin();
     242    for (; iterValues != values.end() && iterLabels != labels.end();
     243         ++iterValues, ++iterLabels)
     244    {
     245        if (*iterValues == value)
     246            return *iterLabels;
     247    }
     248
     249    return "???";
     250}
     251
    238252bool SelectSetting::ReplaceLabel(const QString &new_label, const QString &value)
    239253{
    240254    int i = getValueIndex(value);
     
    299313        QLabel *label = new QLabel();
    300314        label->setText(getLabel() + ":     ");
    301315        layout->addWidget(label);
     316        labelWidget = label;
    302317    }
    303318
    304319    bxwidget = widget;
     
    327342
    328343    widget->setLayout(layout);
    329344
     345    setValue(getValue());
     346
    330347    return widget;
    331348}
    332349
     
    336353    {
    337354        bxwidget = NULL;
    338355        edit     = NULL;
     356        labelWidget = NULL;
    339357    }
    340358}
    341359
     
    373391    Setting::setHelpText(str);
    374392}
    375393
     394static void adjustFont(QWidget *widget, bool isDefault)
     395{
     396    if (widget)
     397    {
     398        QFont f = widget->font();
     399        f.setWeight(isDefault ? QFont::Light : QFont::Bold);
     400        widget->setFont(f);
     401    }
     402}
     403
     404void LineEditSetting::setValue(const QString &newValue)
     405{
     406    if (adjustOnBlank)
     407    {
     408        adjustFont(labelWidget, newValue.isEmpty());
     409        adjustFont(edit,        newValue.isEmpty());
     410    }
     411    Setting::setValue(newValue);
     412}
     413
    376414void BoundedIntegerSetting::setValue(int newValue)
    377415{
    378416    newValue = std::max(std::min(newValue, max), min);
     
    439477
    440478SpinBoxSetting::SpinBoxSetting(
    441479    Storage *_storage, int _min, int _max, int _step,
    442     bool _allow_single_step, QString _special_value_text) :
     480    bool _allow_single_step, QString _special_value_text,
     481    bool change_style_on_special) :
    443482    BoundedIntegerSetting(_storage, _min, _max, _step),
    444483    spinbox(NULL), relayEnabled(true),
    445     sstep(_allow_single_step), svtext("")
     484    sstep(_allow_single_step), svtext(""), labelWidget(NULL),
     485    changeOnSpecial(change_style_on_special)
    446486{
    447487    if (!_special_value_text.isEmpty())
    448488        svtext = _special_value_text;
     
    476516        QLabel *label = new QLabel();
    477517        label->setText(getLabel() + ":     ");
    478518        layout->addWidget(label);
     519        labelWidget = label;
    479520    }
    480521
    481522    bxwidget = widget;
     
    506547
    507548    widget->setLayout(layout);
    508549
     550    setValue(intValue());
     551
    509552    return widget;
    510553}
    511554
     
    515558    {
    516559        bxwidget = NULL;
    517560        spinbox  = NULL;
     561        labelWidget = NULL;
    518562    }
    519563}
    520564
    521565void SpinBoxSetting::setValue(int newValue)
    522566{
    523567    newValue = std::max(std::min(newValue, max), min);
     568    if (changeOnSpecial)
     569    {
     570        adjustFont(labelWidget, (newValue == min));
     571        adjustFont(spinbox,     (newValue == min));
     572    }
    524573    if (spinbox && (spinbox->value() != newValue))
    525574    {
    526575        //int old = intValue();
     
    631680        QLabel *label = new QLabel();
    632681        label->setText(getLabel() + ":     ");
    633682        layout->addWidget(label);
     683        labelWidget = label;
    634684    }
    635685
    636686    bxwidget = widget;
     
    659709            cbwidget, SLOT(clear()));
    660710
    661711    if (rw)
     712    {
    662713        connect(cbwidget, SIGNAL(editTextChanged(const QString &)),
    663714                this, SLOT(editTextChanged(const QString &)));
     715        connect(cbwidget, SIGNAL(editTextChanged(const QString &)),
     716                this, SLOT(changeLabel(const QString &)));
     717    }
    664718
    665719    if (cg)
    666720        connect(cbwidget, SIGNAL(changeHelpText(QString)), cg,
     
    673727
    674728    widget->setLayout(layout);
    675729
     730    setValue(current);
     731
    676732    return widget;
    677733}
    678734
     
    682738    {
    683739        bxwidget = NULL;
    684740        cbwidget = NULL;
     741        labelWidget = NULL;
    685742    }
    686743}
    687744
     
    717774
    718775    if (rw)
    719776    {
     777        changeLabel(newValue);
    720778        Setting::setValue(newValue);
    721779        if (cbwidget)
    722780            cbwidget->setCurrentIndex(current);
     
    727785{
    728786    if (cbwidget)
    729787        cbwidget->setCurrentIndex(which);
     788    changeLabel(labels[which]);
    730789    SelectSetting::setValue(which);
    731790}
    732791
    733 void ComboBoxSetting::addSelection(
    734     const QString &label, QString value, bool select)
     792void ComboBoxSetting::changeLabel(const QString &newLabel)
    735793{
     794    if (changeOnSpecial)
     795    {
     796        adjustFont(labelWidget, specialLabel == newLabel);
     797        adjustFont(cbwidget,    specialLabel == newLabel);
     798    }
     799}
     800
     801void ComboBoxSetting::addSelection(const QString &label, QString value,
     802                                   bool select, bool special_formatting)
     803{
    736804    if ((findSelection(label, value) < 0) && cbwidget)
    737805    {
    738806        cbwidget->insertItem(label);
    739807    }
    740808
     809    if (special_formatting)
     810    {
     811        changeOnSpecial = true;
     812        specialLabel = label;
     813    }
     814
    741815    SelectSetting::addSelection(label, value, select);
    742816
    743817    if (cbwidget && isSet)
     
    9531027    BooleanSetting::setHelpText(str);
    9541028}
    9551029
     1030QWidget* TristateCheckBoxSetting::configWidget(ConfigurationGroup *cg,
     1031                                               QWidget* parent,
     1032                                               const char* widgetName) {
     1033    widget = new MythCheckBox(parent, widgetName, true);
     1034    connect(widget, SIGNAL(destroyed(QObject*)),
     1035            this,   SLOT(widgetDeleted(QObject*)));
     1036
     1037    widget->setHelpText(getHelpText());
     1038    widget->setText(getLabel());
     1039    widget->setCheckState(tristateValue());
     1040    setValue(tristateValue());
     1041
     1042    connect(widget, SIGNAL(stateChanged(int)),
     1043            this, SLOT(setValue(int)));
     1044    connect(this, SIGNAL(valueChanged(int)),
     1045            this, SLOT(relayValueChanged(int)));
     1046
     1047    if (cg)
     1048        connect(widget, SIGNAL(changeHelpText(QString)), cg,
     1049                SIGNAL(changeHelpText(QString)));
     1050
     1051    return widget;
     1052}
     1053
     1054void TristateCheckBoxSetting::widgetInvalid(QObject *obj)
     1055{
     1056    widget = (widget == obj) ? NULL : widget;
     1057}
     1058
     1059void TristateCheckBoxSetting::setEnabled(bool fEnabled)
     1060{
     1061    TristateSetting::setEnabled(fEnabled);
     1062    if (widget)
     1063        widget->setEnabled(fEnabled);
     1064}
     1065
     1066void TristateCheckBoxSetting::setHelpText(const QString &str)
     1067{
     1068    if (widget)
     1069        widget->setHelpText(str);
     1070    TristateSetting::setHelpText(str);
     1071}
     1072
     1073const char *TristateSetting::kPartiallyCheckedString = "default";
     1074
     1075void TristateCheckBoxSetting::setValue(int check)
     1076{
     1077    adjustFont(widget, (check != Qt::Checked && check != Qt::Unchecked));
     1078    TristateSetting::setValue(check);
     1079    emit valueChanged(check);
     1080}
     1081
     1082void TristateSetting::setValue(int check)
     1083{
     1084    if (check == Qt::Checked)
     1085        Setting::setValue("1");
     1086    else if (check == Qt::Unchecked)
     1087        Setting::setValue("0");
     1088    else
     1089        Setting::setValue(kPartiallyCheckedString);
     1090    emit valueChanged(check);
     1091}
     1092
    9561093void AutoIncrementDBSetting::Save(QString table)
    9571094{
    9581095    if (intValue() == 0)
     
    11401277    addSelection(label, value, select);
    11411278}
    11421279
     1280void ImageSelectSetting::addDefaultSelection(const QString label,
     1281                                             const QString value,
     1282                                             const QString defaultValue,
     1283                                             bool select)
     1284{
     1285    for (unsigned i=0; i<values.size(); i++)
     1286    {
     1287        if (values[i] == defaultValue)
     1288        {
     1289            changeOnSpecial = true;
     1290            specialLabel = label;
     1291            images.push_back(new QImage(*images[i]));
     1292            addSelection(label, value, select);
     1293            return;
     1294        }
     1295    }
     1296}
     1297
    11431298ImageSelectSetting::~ImageSelectSetting()
    11441299{
    11451300    Teardown();
     
    11621317    bxwidget   = NULL;
    11631318    imagelabel = NULL;
    11641319    combo      = NULL;
     1320    labelWidget = NULL;
    11651321}
    11661322
    11671323void ImageSelectSetting::imageSet(int num)
     
    12091365        QLabel *label = new QLabel();
    12101366        label->setText(getLabel() + ":");
    12111367        layout->addWidget(label);
     1368        labelWidget = label;
    12121369    }
    12131370
    12141371    combo = new MythComboBox(false);
     
    12551412    connect(combo, SIGNAL(highlighted(int)), this, SLOT(imageSet(int)));
    12561413    connect(combo, SIGNAL(activated(int)), this, SLOT(setValue(int)));
    12571414    connect(combo, SIGNAL(activated(int)), this, SLOT(imageSet(int)));
     1415    connect(combo, SIGNAL(highlighted(const QString &)),
     1416            this, SLOT(changeLabel(const QString &)));
     1417    connect(combo, SIGNAL(activated(const QString &)),
     1418            this, SLOT(changeLabel(const QString &)));
    12581419
    12591420    connect(this, SIGNAL(selectionsCleared()),
    12601421            combo, SLOT(clear()));
     
    12651426
    12661427    bxwidget->setLayout(layout);
    12671428
     1429    changeLabel(GetLabel(current));
     1430
    12681431    return bxwidget;
    12691432}
    12701433
     1434void ImageSelectSetting::changeLabel(const QString &newLabel)
     1435{
     1436    if (changeOnSpecial)
     1437    {
     1438        adjustFont(labelWidget, specialLabel == newLabel);
     1439        adjustFont(combo,       specialLabel == newLabel);
     1440    }
     1441}
     1442
    12711443void ImageSelectSetting::widgetInvalid(QObject *obj)
    12721444{
    12731445    if (bxwidget == obj)
  • libs/libmyth/mythwidgets.cpp

     
    224224        else if (action == "DOWN")
    225225            focusNextPrevChild(true);
    226226        else if (action == "LEFT" || action == "RIGHT" || action == "SELECT")
    227             toggle();
     227        {
     228            if (isTristate())
     229            {
     230                Qt::CheckState newState =
     231                    (Qt::CheckState)(((int)checkState() + 1) % 3);
     232                setCheckState(newState);
     233            }
     234            else
     235                toggle();
     236        }
    228237        else
    229238            handled = false;
    230239    }
  • libs/libmyth/settings.h

     
    134134
    135135class MPUBLIC LineEditSetting : public Setting
    136136{
     137    Q_OBJECT
     138
    137139  protected:
    138     LineEditSetting(Storage *_storage, bool readwrite = true) :
     140    LineEditSetting(Storage *_storage, bool readwrite = true,
     141                    bool adjust_on_blank = false) :
    139142        Setting(_storage), bxwidget(NULL), edit(NULL),
    140         rw(readwrite), password_echo(false) { }
     143        rw(readwrite), password_echo(false),
     144        adjustOnBlank(adjust_on_blank), labelWidget(NULL) { }
    141145
    142146  public:
    143147    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
     
    159163
    160164    virtual void setHelpText(const QString &str);
    161165
     166  public slots:
     167    virtual void setValue(const QString &newValue);
     168
    162169  private:
    163170    QWidget      *bxwidget;
    164171    MythLineEdit *edit;
    165172    bool rw;
    166173    bool password_echo;
     174    bool adjustOnBlank;
     175    QWidget *labelWidget;
    167176};
    168177
    169178// TODO: set things up so that setting the value as a string emits
     
    219228  public:
    220229    SpinBoxSetting(Storage *_storage, int min, int max, int step,
    221230                   bool allow_single_step = false,
    222                    QString special_value_text = "");
     231                   QString special_value_text = "",
     232                   bool change_style_on_special = false);
    223233
    224234    virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
    225235                                  const char *widgetName = 0);
     
    248258    bool         relayEnabled;
    249259    bool         sstep;
    250260    QString      svtext;
     261    QLabel      *labelWidget;
     262    bool         changeOnSpecial;
    251263};
    252264
    253265class MPUBLIC SelectSetting : public Setting
     
    277289        { return (i < labels.size()) ? labels[i] : QString::null; }
    278290    virtual QString GetValue(uint i) const
    279291        { return (i < values.size()) ? values[i] : QString::null; }
     292    virtual QString GetValueLabel(const QString &value);
    280293
    281294signals:
    282295    void selectionAdded(const QString& label, QString value);
     
    318331protected:
    319332    ComboBoxSetting(Storage *_storage, bool _rw = false, int _step = 1) :
    320333        SelectSetting(_storage), rw(_rw),
    321         bxwidget(NULL), cbwidget(NULL), step(_step) { }
     334        bxwidget(NULL), cbwidget(NULL), changeOnSpecial(false),
     335        specialLabel(""), labelWidget(NULL), step(_step) { }
    322336
    323337public:
    324338    virtual void setValue(QString newValue);
     
    340354public slots:
    341355    void addSelection(const QString &label,
    342356                      QString value = QString::null,
    343                       bool select = false);
     357                      bool select = false,
     358                      bool special_formatting = false);
    344359    bool removeSelection(const QString &label,
    345360                         QString value = QString::null);
     361    virtual void changeLabel(const QString &newValue);
    346362    void editTextChanged(const QString &newText);
    347363
    348364private:
    349365    bool rw;
    350366    QWidget      *bxwidget;
    351367    MythComboBox *cbwidget;
     368    bool          changeOnSpecial;
     369    QString       specialLabel;
     370    QLabel       *labelWidget;
    352371
    353372protected:
    354373    int step;
     
    417436    ImageSelectSetting(Storage *_storage) :
    418437        SelectSetting(_storage),
    419438        bxwidget(NULL), imagelabel(NULL), combo(NULL),
    420         m_hmult(1.0f), m_wmult(1.0f) { }
     439        m_hmult(1.0f), m_wmult(1.0f),
     440        changeOnSpecial(false), specialLabel(""), labelWidget(NULL) { }
    421441    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
    422442                                  const char* widgetName = 0);
    423443    virtual void widgetInvalid(QObject *obj);
     
    428448                                   QImage* image,
    429449                                   QString value=QString::null,
    430450                                   bool select=false);
     451    virtual void addDefaultSelection(const QString label,
     452                                     const QString value,
     453                                     const QString defaultValue,
     454                                     bool select);
    431455
    432456protected slots:
    433457    void imageSet(int);
     458    void changeLabel(const QString &newLabel);
    434459
    435460  protected:
    436461    void Teardown(void);
     
    442467    QLabel *imagelabel;
    443468    MythComboBox *combo;
    444469    float m_hmult, m_wmult;
     470    bool          changeOnSpecial;
     471    QString       specialLabel;
     472    QLabel       *labelWidget;
    445473};
    446474
    447475class MPUBLIC BooleanSetting : public Setting
     
    484512    MythCheckBox *widget;
    485513};
    486514
     515class MPUBLIC TristateSetting : public BooleanSetting
     516{
     517    Q_OBJECT
     518
     519  public:
     520    TristateSetting(Storage *_storage) : BooleanSetting(_storage) {}
     521
     522    Qt::CheckState tristateValue(void) const {
     523        if (getValue() == "0")
     524            return Qt::Unchecked;
     525        if (getValue() == "1")
     526            return Qt::Checked;
     527        return Qt::PartiallyChecked;
     528    }
     529
     530    static const char *kPartiallyCheckedString;
     531
     532public slots:
     533    virtual void setValue(/*Qt::CheckState*/int check);
     534
     535signals:
     536    void valueChanged(int);
     537};
     538
     539class MPUBLIC TristateCheckBoxSetting: public TristateSetting {
     540    Q_OBJECT
     541
     542public:
     543    TristateCheckBoxSetting(Storage *_storage) :
     544        TristateSetting(_storage), widget(NULL) { }
     545    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
     546                                  const char* widgetName = 0);
     547    virtual void widgetInvalid(QObject*);
     548
     549    virtual void setEnabled(bool b);
     550
     551    virtual void setHelpText(const QString &str);
     552
     553
     554public slots:
     555    virtual void setValue(/*Qt::CheckState*/int check);
     556    virtual void relayValueChanged(int state) {
     557        if (widget)
     558            widget->setCheckState((Qt::CheckState)state);
     559    }
     560
     561protected:
     562    MythCheckBox *widget;
     563};
     564
    487565class MPUBLIC PathSetting : public ComboBoxSetting
    488566{
    489567public:
  • libs/libmyth/libmyth.pro

     
    6262SOURCES += mythrssmanager.cpp     netgrabbermanager.cpp
    6363SOURCES += rssparse.cpp           netutils.cpp
    6464
     65HEADERS += playsettings.h
     66SOURCES += playsettings.cpp
     67
    6568# remove when everything is switched to mythui
    6669SOURCES += virtualkeyboard_qt.cpp
    6770
  • libs/libmyth/mythconfiggroups.cpp

     
    476476                                            Configurable *target)
    477477{
    478478    VerifyLayout();
     479    bool isDuplicate = triggerMap.values().contains(target);
    479480    triggerMap[triggerValue] = target;
    480481
    481482    if (!configStack)
     
    485486        configStack->setSaveAll(isSaveAll);
    486487    }
    487488
    488     configStack->addChild(target);
     489    // Don't add a target as a child if it has already been added,
     490    // otherwise something goes wrong with signals in the child.
     491    if (!isDuplicate)
     492        configStack->addChild(target);
    489493}
    490494
    491495Setting *TriggeredConfigurationGroup::byName(const QString &settingName)
  • libs/libmyth/mythwidgets.h

     
    329329    Q_OBJECT
    330330
    331331  public:
    332     MythCheckBox(QWidget *parent = 0, const char *name = "MythCheckBox")
    333         : QCheckBox(parent)       { setObjectName(name); };
     332    MythCheckBox(QWidget *parent = 0, const char *name = "MythCheckBox",
     333                 bool isTristate = false) : QCheckBox(parent)
     334    {
     335        setObjectName(name);
     336        setTristate(isTristate);
     337    }
    334338    MythCheckBox(const QString &text,
    335                  QWidget *parent = 0, const char *name = "MythCheckBox")
    336         : QCheckBox(text, parent) { setObjectName(name); };
     339                 QWidget *parent = 0, const char *name = "MythCheckBox",
     340                 bool isTristate = false) : QCheckBox(text, parent)
     341    {
     342        setObjectName(name);
     343        setTristate(isTristate);
     344    }
    337345
    338346    void setHelpText(const QString&);
    339347
  • programs/mythfrontend/globalsettings.cpp

     
    3737#include "mythconfig.h"
    3838#include "mythdirs.h"
    3939#include "mythuihelper.h"
     40#include "playsettings.h"
    4041
     42#define CREATE_CHECKBOX_SETTING(var, name, settings) \
     43    BooleanSetting *var; \
     44    if ((settings)) \
     45        var = new PlaySettingsCheckBox((name), (settings)); \
     46    else \
     47        var = new HostCheckBox((name))
     48
     49#define CREATE_COMBOBOX_SETTING(var, name, settings) \
     50    ComboBoxSetting *var; \
     51    if ((settings)) \
     52        var = new PlaySettingsComboBox((name), (settings)); \
     53    else \
     54        var = new HostComboBox((name))
     55
     56#define CREATE_COMBOBOX1_SETTING(var, name, settings, arg1) \
     57    ComboBoxSetting *var; \
     58    if ((settings)) \
     59        var = new PlaySettingsComboBox((name), (settings), (arg1)); \
     60    else \
     61        var = new HostComboBox((name), (arg1))
     62
     63#define CREATE_SPINBOX_SETTING(var, name, settings, arg1, arg2, arg3, arg4) \
     64    SpinBoxSetting *var; \
     65    if ((settings)) \
     66        var = new PlaySettingsSpinBox((name), (settings), (arg1), (arg2), (arg3), (arg4)); \
     67    else \
     68        var = new HostSpinBox((name), (arg1), (arg2), (arg3), (arg4))
     69
     70#define CREATE_LINEEDIT_SETTING(var, name, settings) \
     71    LineEditSetting *var; \
     72    if ((settings)) \
     73        var = new PlaySettingsLineEdit((name), (settings), ""); \
     74    else \
     75        var = new HostLineEdit((name))
     76
     77// For PlaySettings, use a SpinBox instead of a Slider so that a
     78// default value can be easily used.
     79#define CREATE_SLIDER_SETTING(var, name, settings, arg1, arg2, arg3) \
     80    BoundedIntegerSetting *var; \
     81    if ((settings)) \
     82        var = new PlaySettingsSpinBox((name), (settings), (arg1), (arg2), (arg3)); \
     83    else \
     84        var = new HostSlider((name), (arg1), (arg2), (arg3))
     85
     86#define CREATE_IMAGESELECT_SETTING(var, name, settings) \
     87    ImageSelectSetting *var; \
     88    if ((settings)) \
     89        var = new PlaySettingsImageSelect((name), (settings)); \
     90    else \
     91        var = new HostImageSelect((name))
     92
     93static Setting *wrap(Setting *obj, PlaySettings *settings,
     94                     bool twoLineLabel=false)
     95{
     96    if (!settings)
     97        return obj;
     98
     99    // Get the setting name
     100    PlaySettingsCombinedStorage *storage =
     101        dynamic_cast<PlaySettingsCombinedStorage *>(obj);
     102    const QString &name = storage->getName();
     103
     104    // Get the default value and label.  The label is  different
     105    // from the value for most object types.
     106    QString defaultValue = settings->GetSetting(name, "", true);
     107    QString defaultLabel(defaultValue);
     108    if (dynamic_cast<BooleanSetting *>(obj))
     109        defaultLabel = (defaultValue == "0" || defaultValue.isEmpty() ?
     110                        QObject::tr("disabled") : QObject::tr("enabled"));
     111    if (dynamic_cast<SpinBoxSetting *>(obj) && defaultValue.isEmpty())
     112        defaultLabel = "0";
     113    ComboBoxSetting *cb = dynamic_cast<ComboBoxSetting *>(obj);
     114    if (cb)
     115    {
     116        defaultLabel = cb->GetValueLabel(defaultValue);
     117        // Add the default selection to a ComboBox
     118        cb->addSelection(QString("(") + QObject::tr("default") + ")",
     119                         storage->getDefault(),
     120                         !settings->IsOverridden(name),
     121                         true);
     122    }
     123    ImageSelectSetting *is = dynamic_cast<ImageSelectSetting *>(obj);
     124    if (is)
     125    {
     126        defaultLabel = is->GetValueLabel(defaultValue);
     127        // Add the default selection to a ImageSelect
     128        is->addDefaultSelection(QString("(") + QObject::tr("default") + ")",
     129                                storage->getDefault(),
     130                                defaultValue,
     131                                !settings->IsOverridden(name));
     132    }
     133   
     134    // Change the help text to include the default and its source.
     135    QString helpPrefix;
     136    if (dynamic_cast<LineEditSetting *>(obj))
     137        helpPrefix = QObject::tr("Leave blank to keep default value");
     138    else
     139        helpPrefix = QObject::tr("Override default value");
     140    helpPrefix += " (" + defaultLabel + ") ";
     141    QString inheritsFrom = settings->InheritsFrom(name);
     142    if (inheritsFrom.isNull())
     143        helpPrefix += QObject::tr("from global settings");
     144    else
     145        helpPrefix += QObject::tr("from group") + " " + inheritsFrom;
     146    helpPrefix += ". " + obj->getHelpText();
     147    obj->setHelpText(helpPrefix);
     148
     149    // Change the label to include the default.
     150    obj->setLabel(obj->getLabel() + (twoLineLabel ? "\n" : "") +
     151                  " (" + defaultLabel + ")");
     152
     153    return obj;
     154}
     155
    41156class TriggeredItem : public TriggeredConfigurationGroup
    42157{
    43158  public:
     
    593708    return gs;
    594709}
    595710
    596 static HostCheckBox *DecodeExtraAudio()
     711static Setting *DecodeExtraAudio(PlaySettings *settings)
    597712{
    598     HostCheckBox *gc = new HostCheckBox("DecodeExtraAudio");
     713    CREATE_CHECKBOX_SETTING(gc, "DecodeExtraAudio", settings);
    599714    gc->setLabel(QObject::tr("Extra audio buffering"));
    600715    gc->setValue(true);
    601716    gc->setHelpText(QObject::tr("Enable this setting if MythTV is playing "
     
    604719                    "effect on framegrabbers (MPEG-4/RTJPEG). MythTV will "
    605720                    "keep extra audio data in its internal buffers to "
    606721                    "workaround this bug."));
    607     return gc;
     722    return wrap(gc, settings);
    608723}
    609724
    610 static HostComboBox *PIPLocationComboBox()
     725static Setting *PIPLocationComboBox(PlaySettings *settings)
    611726{
    612     HostComboBox *gc = new HostComboBox("PIPLocation");
     727    CREATE_COMBOBOX_SETTING(gc, "PIPLocation", settings);
    613728    gc->setLabel(QObject::tr("PIP video location"));
    614729    for (uint loc = 0; loc < kPIP_END; ++loc)
    615730        gc->addSelection(toString((PIPLocation) loc), QString::number(loc));
    616731    gc->setHelpText(QObject::tr("Location of PIP Video window."));
    617     return gc;
     732    return wrap(gc, settings);
    618733}
    619734
    620735static GlobalLineEdit *AllRecGroupPassword()
     
    710825    return gc;
    711826}
    712827
    713 static HostCheckBox *SmartForward()
     828static Setting *SmartForward(PlaySettings *settings)
    714829{
    715     HostCheckBox *gc = new HostCheckBox("SmartForward");
     830    CREATE_CHECKBOX_SETTING(gc, "SmartForward", settings);
    716831    gc->setLabel(QObject::tr("Smart fast forwarding"));
    717832    gc->setValue(false);
    718833    gc->setHelpText(QObject::tr("If enabled, then immediately after "
    719834                    "rewinding, only skip forward the same amount as "
    720835                    "skipping backwards."));
    721     return gc;
     836    return wrap(gc, settings);
    722837}
    723838
    724 static HostCheckBox *ExactSeeking()
     839static Setting *ExactSeeking(PlaySettings *settings)
    725840{
    726     HostCheckBox *gc = new HostCheckBox("ExactSeeking");
     841    CREATE_CHECKBOX_SETTING(gc, "ExactSeeking", settings);
    727842    gc->setLabel(QObject::tr("Seek to exact frame"));
    728843    gc->setValue(false);
    729844    gc->setHelpText(QObject::tr("If enabled, seeking is frame exact, but "
    730845                    "slower."));
    731     return gc;
     846    return wrap(gc, settings);
    732847}
    733848
    734849static GlobalComboBox *CommercialSkipMethod()
     
    746861    return bc;
    747862}
    748863
    749 static HostComboBox *AutoCommercialSkip()
     864static Setting *AutoCommercialSkip(PlaySettings *settings)
    750865{
    751     HostComboBox *gc = new HostComboBox("AutoCommercialSkip");
     866    CREATE_COMBOBOX_SETTING(gc, "AutoCommercialSkip", settings);
    752867    gc->setLabel(QObject::tr("Automatically skip commercials"));
    753868    gc->addSelection(QObject::tr("Off"), "0");
    754869    gc->addSelection(QObject::tr("Notify, but do not skip"), "2");
     
    757872                    "have been flagged during automatic commercial detection "
    758873                    "or by the mythcommflag program, or just notify that a "
    759874                    "commercial has been detected."));
    760     return gc;
     875    return wrap(gc, settings);
    761876}
    762877
    763878static GlobalCheckBox *AutoCommercialFlag()
     
    843958    return bc;
    844959}
    845960
    846 static HostSpinBox *CommRewindAmount()
     961static Setting *CommRewindAmount(PlaySettings *settings)
    847962{
    848     HostSpinBox *gs = new HostSpinBox("CommRewindAmount", 0, 10, 1);
     963    CREATE_SPINBOX_SETTING(gs, "CommRewindAmount", settings, 0, 10, 1, false);
    849964    gs->setLabel(QObject::tr("Commercial skip automatic rewind amount (secs)"));
    850965    gs->setHelpText(QObject::tr("MythTV will automatically rewind "
    851966                    "this many seconds after performing a commercial skip."));
    852967    gs->setValue(0);
    853     return gs;
     968    return wrap(gs, settings);
    854969}
    855970
    856 static HostSpinBox *CommNotifyAmount()
     971static Setting *CommNotifyAmount(PlaySettings *settings)
    857972{
    858     HostSpinBox *gs = new HostSpinBox("CommNotifyAmount", 0, 10, 1);
     973    CREATE_SPINBOX_SETTING(gs, "CommNotifyAmount", settings, 0, 10, 1, false);
    859974    gs->setLabel(QObject::tr("Commercial skip notify amount (secs)"));
    860975    gs->setHelpText(QObject::tr("MythTV will act like a commercial "
    861976                    "begins this many seconds early. This can be useful "
    862977                    "when commercial notification is used in place of "
    863978                    "automatic skipping."));
    864979    gs->setValue(0);
    865     return gs;
     980    return wrap(gs, settings);
    866981}
    867982
    868983static GlobalSpinBox *MaximumCommercialSkip()
     
    16641779    labels[j]->setValue(label_i);
    16651780}
    16661781
    1667 PlaybackProfileConfigs::PlaybackProfileConfigs(const QString &str) :
     1782PlaybackProfileConfigs::PlaybackProfileConfigs(const QString &str,
     1783                                               PlaySettings *settings) :
    16681784    TriggeredConfigurationGroup(false, true,  true, true,
    16691785                                false, false, true, true), grouptrigger(NULL)
    16701786{
    16711787    setLabel(QObject::tr("Playback Profiles") + str);
     1788    if (settings)
     1789        setLabel(QObject::tr("Playback group settings for ") +
     1790                 settings->mGroupName + " - " +
     1791                 getLabel());
    16721792
    16731793    QString host = gCoreContext->GetHostName();
    16741794    QStringList profiles = VideoDisplayProfile::GetProfiles(host);
     
    16961816        profiles = VideoDisplayProfile::GetProfiles(host);
    16971817    }
    16981818
    1699     QString profile = VideoDisplayProfile::GetDefaultProfileName(host);
     1819    QString profile = VideoDisplayProfile::GetDefaultProfileName(host, settings);
    17001820    if (!profiles.contains(profile))
    17011821    {
    17021822        profile = (profiles.contains("Normal")) ? "Normal" : profiles[0];
    17031823        VideoDisplayProfile::SetDefaultProfileName(profile, host);
    17041824    }
    17051825
    1706     grouptrigger = new HostComboBox("DefaultVideoPlaybackProfile");
     1826    CREATE_COMBOBOX_SETTING(gs, "DefaultVideoPlaybackProfile", settings);
     1827    grouptrigger = gs;
    17071828    grouptrigger->setLabel(QObject::tr("Current Video Playback Profile"));
    17081829    QStringList::const_iterator it;
    17091830    for (it = profiles.begin(); it != profiles.end(); ++it)
    17101831        grouptrigger->addSelection(ProgramInfo::i18n(*it), *it);
     1832    if (settings)
     1833    {
     1834        addChild(wrap(grouptrigger, settings));
     1835        return;
     1836    }
    17111837
    17121838    HorizontalConfigurationGroup *grp =
    17131839        new HorizontalConfigurationGroup(false, false, true, true);
     
    18401966    return gc;
    18411967}
    18421968
    1843 static HostSpinBox *FFRewReposTime()
     1969static Setting *FFRewReposTime(PlaySettings *settings)
    18441970{
    1845     HostSpinBox *gs = new HostSpinBox("FFRewReposTime", 0, 200, 5);
     1971    CREATE_SPINBOX_SETTING(gs, "FFRewReposTime", settings, 0, 200, 5, false);
    18461972    gs->setLabel(QObject::tr("Fast forward/rewind reposition amount"));
    18471973    gs->setValue(100);
    18481974    gs->setHelpText(QObject::tr("When exiting sticky keys fast forward/rewind "
     
    18501976                    "resuming normal playback. This "
    18511977                    "compensates for the reaction time between seeing "
    18521978                    "where to resume playback and actually exiting seeking."));
    1853     return gs;
     1979    return wrap(gs, settings);
    18541980}
    18551981
    1856 static HostCheckBox *FFRewReverse()
     1982static Setting *FFRewReverse(PlaySettings *settings)
    18571983{
    1858     HostCheckBox *gc = new HostCheckBox("FFRewReverse");
     1984    CREATE_CHECKBOX_SETTING(gc, "FFRewReverse", settings);
    18591985    gc->setLabel(QObject::tr("Reverse direction in fast forward/rewind"));
    18601986    gc->setValue(true);
    18611987    gc->setHelpText(QObject::tr("If enabled, pressing the sticky rewind key "
     
    18631989                    "vice versa. If disabled, it will decrease the "
    18641990                    "current speed or switch to play mode if "
    18651991                    "the speed can't be decreased further."));
    1866     return gc;
     1992    return wrap(gc, settings);
    18671993}
    18681994
    18691995static HostComboBox *MenuTheme()
     
    19142040    return gc;
    19152041}
    19162042
    1917 static HostSpinBox *OSDCC708TextZoomPercentage(void)
     2043static Setting *OSDCC708TextZoomPercentage(PlaySettings *settings)
    19182044{
    1919     HostSpinBox *gs = new HostSpinBox("OSDCC708TextZoom", 50, 200, 5);
     2045    CREATE_SPINBOX_SETTING(gs, "OSDCC708TextZoom", settings,
     2046                           50, 200, 5, false);
    19202047    gs->setLabel(QObject::tr("ATSC caption text zoom percentage"));
    19212048    gs->setValue(100);
    19222049    gs->setHelpText(QObject::tr("Use this to enlarge or shrink captions."));
    19232050
    1924     return gs;
     2051    return wrap(gs, settings);
    19252052}
    19262053
    1927 static HostComboBox *SubtitleCodec()
     2054static Setting *SubtitleCodec(PlaySettings *settings)
    19282055{
    1929     HostComboBox *gc = new HostComboBox("SubtitleCodec");
     2056    CREATE_COMBOBOX_SETTING(gc, "SubtitleCodec", settings);
    19302057
    19312058    gc->setLabel(QObject::tr("Subtitle Codec"));
    19322059    QList<QByteArray> list = QTextCodec::availableCodecs();
     
    19482075    return gc;
    19492076}
    19502077
    1951 static HostSpinBox *VertScanPercentage()
     2078static Setting *VertScanPercentage(PlaySettings *settings)
    19522079{
    1953     HostSpinBox *gs = new HostSpinBox("VertScanPercentage", -100, 100, 1);
     2080    CREATE_SPINBOX_SETTING(gs, "VertScanPercentage", settings,
     2081                           -100, 100, 1, false);
    19542082    gs->setLabel(QObject::tr("Vertical scaling"));
    19552083    gs->setValue(0);
    19562084    gs->setHelpText(QObject::tr(
    19572085                        "Adjust this if the image does not fill your "
    19582086                        "screen vertically. Range -100% to 100%"));
    1959     return gs;
     2087    return wrap(gs, settings);
    19602088}
    19612089
    1962 static HostSpinBox *HorizScanPercentage()
     2090static Setting *HorizScanPercentage(PlaySettings *settings)
    19632091{
    1964     HostSpinBox *gs = new HostSpinBox("HorizScanPercentage", -100, 100, 1);
     2092    CREATE_SPINBOX_SETTING(gs, "HorizScanPercentage", settings,
     2093                           -100, 100, 1, false);
    19652094    gs->setLabel(QObject::tr("Horizontal scaling"));
    19662095    gs->setValue(0);
    19672096    gs->setHelpText(QObject::tr(
    19682097                        "Adjust this if the image does not fill your "
    19692098                        "screen horizontally. Range -100% to 100%"));
    1970     return gs;
     2099    return wrap(gs, settings);
    19712100};
    19722101
    1973 static HostSpinBox *XScanDisplacement()
     2102static Setting *XScanDisplacement(PlaySettings *settings)
    19742103{
    1975     HostSpinBox *gs = new HostSpinBox("XScanDisplacement", -50, 50, 1);
     2104    CREATE_SPINBOX_SETTING(gs, "XScanDisplacement", settings,
     2105                           -50, 50, 1, false);
    19762106    gs->setLabel(QObject::tr("Scan displacement (X)"));
    19772107    gs->setValue(0);
    19782108    gs->setHelpText(QObject::tr("Adjust this to move the image horizontally."));
    1979     return gs;
     2109    return wrap(gs, settings);
    19802110}
    19812111
    1982 static HostSpinBox *YScanDisplacement()
     2112static Setting *YScanDisplacement(PlaySettings *settings)
    19832113{
    1984     HostSpinBox *gs = new HostSpinBox("YScanDisplacement", -50, 50, 1);
     2114    CREATE_SPINBOX_SETTING(gs, "YScanDisplacement", settings,
     2115                           -50, 50, 1, false);
    19852116    gs->setLabel(QObject::tr("Scan displacement (Y)"));
    19862117    gs->setValue(0);
    19872118    gs->setHelpText(QObject::tr("Adjust this to move the image vertically."));
    1988     return gs;
     2119    return wrap(gs, settings);
    19892120};
    19902121
    19912122static HostCheckBox *AlwaysStreamFiles()
     
    20002131    return gc;
    20012132}
    20022133
    2003 static HostCheckBox *CCBackground()
     2134static Setting *CCBackground(PlaySettings *settings)
    20042135{
    2005     HostCheckBox *gc = new HostCheckBox("CCBackground");
     2136    CREATE_CHECKBOX_SETTING(gc, "CCBackground", settings);
    20062137    gc->setLabel(QObject::tr("Black background for closed captioning"));
    20072138    gc->setValue(false);
    20082139    gc->setHelpText(QObject::tr(
    20092140                        "If enabled, captions will be displayed "
    20102141                        "as white text over a black background "
    20112142                        "for better contrast."));
    2012     return gc;
     2143    return wrap(gc, settings);
    20132144}
    20142145
    2015 static HostCheckBox *DefaultCCMode()
     2146static Setting *DefaultCCMode(PlaySettings *settings)
    20162147{
    2017     HostCheckBox *gc = new HostCheckBox("DefaultCCMode");
     2148    CREATE_CHECKBOX_SETTING(gc, "DefaultCCMode", settings);
    20182149    gc->setLabel(QObject::tr("Always display closed captioning or subtitles"));
    20192150    gc->setValue(false);
    20202151    gc->setHelpText(QObject::tr(
     
    20222153                        "when playing back recordings or watching "
    20232154                        "Live TV. Closed Captioning can be turned on or off "
    20242155                        "by pressing \"T\" during playback."));
    2025     return gc;
     2156    return wrap(gc, settings);
    20262157}
    20272158
    2028 static HostCheckBox *PreferCC708()
     2159static Setting *PreferCC708(PlaySettings *settings)
    20292160{
    2030     HostCheckBox *gc = new HostCheckBox("Prefer708Captions");
     2161    CREATE_CHECKBOX_SETTING(gc, "Prefer708Captions", settings);
    20312162    gc->setLabel(QObject::tr("Prefer EIA-708 over EIA-608 captions"));
    20322163    gc->setValue(true);
    20332164    gc->setHelpText(
     
    20352166            "If enabled, the newer EIA-708 captions will be preferred over "
    20362167            "the older EIA-608 captions in ATSC streams."));
    20372168
    2038     return gc;
     2169    return wrap(gc, settings);
    20392170}
    20402171
    2041 static HostCheckBox *EnableMHEG()
     2172static Setting *EnableMHEG(PlaySettings *settings)
    20422173{
    2043     HostCheckBox *gc = new HostCheckBox("EnableMHEG");
     2174    CREATE_CHECKBOX_SETTING(gc, "EnableMHEG", settings);
    20442175    gc->setLabel(QObject::tr("Enable interactive TV"));
    20452176    gc->setValue(false);
    20462177    gc->setHelpText(QObject::tr(
    20472178                        "If enabled, interactive TV applications (MHEG) will "
    20482179                        "be activated. This is used for teletext and logos for "
    20492180                        "radio and channels that are currently off-air."));
    2050     return gc;
     2181    return wrap(gc, settings);
    20512182}
    20522183
    2053 static HostCheckBox *PersistentBrowseMode()
     2184static Setting *PersistentBrowseMode(PlaySettings *settings)
    20542185{
    2055     HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
     2186    CREATE_CHECKBOX_SETTING(gc, "PersistentBrowseMode", settings);
    20562187    gc->setLabel(QObject::tr("Always use browse mode in Live TV"));
    20572188    gc->setValue(true);
    20582189    gc->setHelpText(
    20592190        QObject::tr(
    20602191            "If enabled, browse mode will automatically be activated "
    20612192            "whenever you use channel up/down while watching Live TV."));
    2062     return gc;
     2193    return wrap(gc, settings);
    20632194}
    20642195
    2065 static HostCheckBox *BrowseAllTuners()
     2196static Setting *BrowseAllTuners(PlaySettings *settings)
    20662197{
    2067     HostCheckBox *gc = new HostCheckBox("BrowseAllTuners");
     2198    CREATE_CHECKBOX_SETTING(gc, "BrowseAllTuners", settings);
    20682199    gc->setLabel(QObject::tr("Browse all channels"));
    20692200    gc->setValue(false);
    20702201    gc->setHelpText(
     
    20722203            "If enabled, browse mode will shows channels on all "
    20732204            "available recording devices, instead of showing "
    20742205            "channels on just the current recorder."));
    2075     return gc;
     2206    return wrap(gc, settings);
    20762207}
    20772208
    2078 static HostCheckBox *ClearSavedPosition()
     2209static Setting *ClearSavedPosition(PlaySettings *settings)
    20792210{
    2080     HostCheckBox *gc = new HostCheckBox("ClearSavedPosition");
     2211    CREATE_CHECKBOX_SETTING(gc, "ClearSavedPosition", settings);
    20812212    gc->setLabel(QObject::tr("Clear bookmark on playback"));
    20822213    gc->setValue(true);
    20832214    gc->setHelpText(QObject::tr("If enabled, automatically clear the "
    20842215                    "bookmark on a recording when the recording is played "
    20852216                    "back. If disabled, you can mark the beginning with "
    20862217                    "rewind then save position."));
    2087     return gc;
     2218    return wrap(gc, settings);
    20882219}
    20892220
    2090 static HostCheckBox *AltClearSavedPosition()
     2221static Setting *AltClearSavedPosition(PlaySettings *settings)
    20912222{
    2092     HostCheckBox *gc = new HostCheckBox("AltClearSavedPosition");
     2223    CREATE_CHECKBOX_SETTING(gc, "AltClearSavedPosition", settings);
    20932224    gc->setLabel(QObject::tr("Alternate clear and save bookmark"));
    20942225    gc->setValue(true);
    20952226    gc->setHelpText(QObject::tr("During playback the SELECT key "
     
    20972228                    "Saved\" and \"Bookmark Cleared\". If disabled, the "
    20982229                    "SELECT key will save the current position for each "
    20992230                    "keypress."));
    2100     return gc;
     2231    return wrap(gc, settings);
    21012232}
    21022233
    21032234#if defined(USING_XV) || defined(USING_OPENGL_VIDEO) || defined(USING_VDPAU)
    2104 static HostCheckBox *UsePicControls()
     2235static Setting *UsePicControls(PlaySettings *settings)
    21052236{
    2106     HostCheckBox *gc = new HostCheckBox("UseOutputPictureControls");
     2237    CREATE_CHECKBOX_SETTING(gc, "UseOutputPictureControls", settings);
    21072238    gc->setLabel(QObject::tr("Enable picture controls"));
    21082239    gc->setValue(false);
    21092240    gc->setHelpText(
    21102241        QObject::tr(
    21112242            "If enabled, MythTV attempts to initialize picture controls "
    21122243            "(brightness, contrast, etc.) that are applied during playback."));
    2113     return gc;
     2244    return wrap(gc, settings);
    21142245}
    21152246#endif
    21162247
    2117 static HostLineEdit *UDPNotifyPort()
     2248static Setting *UDPNotifyPort(PlaySettings *settings)
    21182249{
    2119     HostLineEdit *ge = new HostLineEdit("UDPNotifyPort");
     2250    CREATE_LINEEDIT_SETTING(ge, "UDPNotifyPort", settings);
    21202251    ge->setLabel(QObject::tr("UDP notify port"));
    21212252    ge->setValue("6948");
    21222253    ge->setHelpText(QObject::tr("During playback, MythTV will listen for "
    21232254                    "connections from the \"mythtvosd\" or \"mythudprelay\" "
    21242255                    "programs on this port. For additional information, see "
    21252256                    "http://www.mythtv.org/wiki/MythNotify ."));
    2126     return ge;
     2257    return wrap(ge, settings);
    21272258}
    21282259
    2129 static HostComboBox *PlaybackExitPrompt()
     2260static Setting *PlaybackExitPrompt(PlaySettings *settings)
    21302261{
    2131     HostComboBox *gc = new HostComboBox("PlaybackExitPrompt");
     2262    CREATE_COMBOBOX_SETTING(gc, "PlaybackExitPrompt", settings);
    21322263    gc->setLabel(QObject::tr("Action on playback exit"));
    21332264    gc->addSelection(QObject::tr("Just exit"), "0");
    21342265    gc->addSelection(QObject::tr("Save position and exit"), "2");
     
    21392270                    "when you exit playback mode. The options available will "
    21402271                    "allow you to save your position, delete the "
    21412272                    "recording, or continue watching."));
    2142     return gc;
     2273    return wrap(gc, settings);
    21432274}
    21442275
    2145 static HostCheckBox *EndOfRecordingExitPrompt()
     2276static Setting *EndOfRecordingExitPrompt(PlaySettings *settings)
    21462277{
    2147     HostCheckBox *gc = new HostCheckBox("EndOfRecordingExitPrompt");
     2278    CREATE_CHECKBOX_SETTING(gc, "EndOfRecordingExitPrompt", settings);
    21482279    gc->setLabel(QObject::tr("Prompt at end of recording"));
    21492280    gc->setValue(false);
    21502281    gc->setHelpText(QObject::tr("If enabled, a menu will be displayed allowing "
    21512282                    "you to delete the recording when it has finished "
    21522283                    "playing."));
    2153     return gc;
     2284    return wrap(gc, settings);
    21542285}
    21552286
    2156 static HostCheckBox *JumpToProgramOSD()
     2287static Setting *JumpToProgramOSD(PlaySettings *settings)
    21572288{
    2158     HostCheckBox *gc = new HostCheckBox("JumpToProgramOSD");
     2289    CREATE_CHECKBOX_SETTING(gc, "JumpToProgramOSD", settings);
    21592290    gc->setLabel(QObject::tr("Jump to program OSD"));
    21602291    gc->setValue(true);
    21612292    gc->setHelpText(QObject::tr(
     
    21642295                        "'Watch Recording' screen when 'Jump to Program' "
    21652296                        "is activated. If enabled, the recordings are shown "
    21662297                        "in the OSD"));
    2167     return gc;
     2298    return wrap(gc, settings);
    21682299}
    21692300
    2170 static HostCheckBox *ContinueEmbeddedTVPlay()
     2301static Setting *ContinueEmbeddedTVPlay(PlaySettings *settings)
    21712302{
    2172     HostCheckBox *gc = new HostCheckBox("ContinueEmbeddedTVPlay");
     2303    CREATE_CHECKBOX_SETTING(gc, "ContinueEmbeddedTVPlay", settings);
    21732304    gc->setLabel(QObject::tr("Continue playback when embedded"));
    21742305    gc->setValue(false);
    21752306    gc->setHelpText(QObject::tr(
     
    21772308                    "is embedded in the upcoming program list or recorded "
    21782309                    "list. The default is to pause the recorded show when "
    21792310                    "embedded."));
    2180     return gc;
     2311    return wrap(gc, settings);
    21812312}
    21822313
    2183 static HostCheckBox *AutomaticSetWatched()
     2314static Setting *AutomaticSetWatched(PlaySettings *settings)
    21842315{
    2185     HostCheckBox *gc = new HostCheckBox("AutomaticSetWatched");
     2316    CREATE_CHECKBOX_SETTING(gc, "AutomaticSetWatched", settings);
    21862317    gc->setLabel(QObject::tr("Automatically mark a recording as watched"));
    21872318    gc->setValue(false);
    21882319    gc->setHelpText(QObject::tr("If enabled, when you exit near the end of a "
     
    21902321                    "detection is not foolproof, so do not enable this "
    21912322                    "setting if you don't want an unwatched recording marked "
    21922323                    "as watched."));
    2193     return gc;
     2324    return wrap(gc, settings);
    21942325}
    21952326
    21962327static HostSpinBox *LiveTVIdleTimeout()
     
    23902521    return gc;
    23912522}
    23922523
    2393 static HostComboBox *LetterboxingColour()
     2524static Setting *LetterboxingColour(PlaySettings *settings)
    23942525{
    2395     HostComboBox *gc = new HostComboBox("LetterboxColour");
     2526    CREATE_COMBOBOX_SETTING(gc, "LetterboxColour", settings);
    23962527    gc->setLabel(QObject::tr("Letterboxing color"));
    23972528    for (int m = kLetterBoxColour_Black; m < kLetterBoxColour_END; ++m)
    23982529        gc->addSelection(toString((LetterBoxColour)m), QString::number(m));
     
    24022533            "letterboxing, but those with plasma screens may prefer gray "
    24032534            "to minimize burn-in.") + " " +
    24042535        QObject::tr("Currently only works with XVideo video renderer."));
    2405     return gc;
     2536    return wrap(gc, settings);
    24062537}
    24072538
    2408 static HostComboBox *AspectOverride()
     2539static Setting *AspectOverride(PlaySettings *settings)
    24092540{
    2410     HostComboBox *gc = new HostComboBox("AspectOverride");
     2541    CREATE_COMBOBOX_SETTING(gc, "AspectOverride", settings);
    24112542    gc->setLabel(QObject::tr("Video aspect override"));
    24122543    for (int m = kAspect_Off; m < kAspect_END; ++m)
    24132544        gc->addSelection(toString((AspectOverrideMode)m), QString::number(m));
     
    24152546                        "When enabled, these will override the aspect "
    24162547                        "ratio specified by any broadcaster for all "
    24172548                        "video streams."));
    2418     return gc;
     2549    return wrap(gc, settings);
    24192550}
    24202551
    2421 static HostComboBox *AdjustFill()
     2552static Setting *AdjustFill(PlaySettings *settings)
    24222553{
    2423     HostComboBox *gc = new HostComboBox("AdjustFill");
     2554    CREATE_COMBOBOX_SETTING(gc, "AdjustFill", settings);
    24242555    gc->setLabel(QObject::tr("Zoom"));
    24252556    gc->addSelection(toString(kAdjustFill_AutoDetect_DefaultOff),
    24262557                     QString::number(kAdjustFill_AutoDetect_DefaultOff));
     
    24312562    gc->setHelpText(QObject::tr(
    24322563                        "When enabled, these will apply a predefined "
    24332564                        "zoom to all video playback in MythTV."));
    2434     return gc;
     2565    return wrap(gc, settings);
    24352566}
    24362567
    24372568// Theme settings
     
    28532984    return gc;
    28542985}
    28552986
    2856 ThemeSelector::ThemeSelector(QString label):
    2857     HostImageSelect(label) {
    2858 
     2987static Setting *ThemeSelector(QString label, PlaySettings *settings=NULL)
     2988{
     2989    CREATE_IMAGESELECT_SETTING(gs, label, settings);
    28592990    ThemeType themetype = THEME_UI;
    28602991
    28612992    if (label == "Theme")
    28622993    {
    28632994        themetype = THEME_UI;
    2864         setLabel(QObject::tr("UI theme"));
     2995        gs->setLabel(QObject::tr("UI theme"));
    28652996    }
    28662997    else if (label == "MenuTheme")
    28672998    {
    28682999        themetype = THEME_MENU;
    2869         setLabel(QObject::tr("Menu theme"));
     3000        gs->setLabel(QObject::tr("Menu theme"));
    28703001    }
    28713002
    28723003    QDir themes(GetThemesParentDir());
     
    29303061            VERBOSE(VB_IMPORTANT, QString("Problem reading theme preview image"
    29313062                                          " %1").arg(preview.filePath()));
    29323063
    2933         addImageSelection(name, previewImage, theme.fileName());
     3064        gs->addImageSelection(name, previewImage, theme.fileName());
    29343065    }
    29353066
    29363067    if (themetype & THEME_UI)
    2937         setValue(DEFAULT_UI_THEME);
     3068        gs->setValue(DEFAULT_UI_THEME);
     3069
     3070    return wrap(gs, settings);
    29383071}
    29393072
    29403073static HostComboBox *ChannelFormat()
     
    34373570    return gs;
    34383571}
    34393572
    3440 static HostCheckBox *RealtimePriority()
     3573static Setting *RealtimePriority(PlaySettings *settings)
    34413574{
    3442     HostCheckBox *gc = new HostCheckBox("RealtimePriority");
     3575    CREATE_CHECKBOX_SETTING(gc, "RealtimePriority", settings);
    34433576    gc->setLabel(QObject::tr("Enable realtime priority threads"));
    34443577    gc->setHelpText(QObject::tr("When running mythfrontend with root "
    34453578                    "privileges, some threads can be given enhanced priority. "
    34463579                    "Disable this if mythfrontend freezes during video "
    34473580                    "playback."));
    34483581    gc->setValue(true);
    3449     return gc;
     3582    return wrap(gc, settings, false);
    34503583}
    34513584
    34523585static HostCheckBox *EnableMediaMon()
     
    36023735};
    36033736
    36043737#ifdef USING_OPENGL_VSYNC
    3605 static HostCheckBox *UseOpenGLVSync()
     3738static Setting *UseOpenGLVSync(PlaySettings *settings)
    36063739{
    3607     HostCheckBox *gc = new HostCheckBox("UseOpenGLVSync");
     3740    CREATE_CHECKBOX_SETTING(gc, "UseOpenGLVSync", settings);
    36083741    gc->setLabel(QObject::tr("Enable OpenGL vertical sync for timing"));
    36093742    gc->setValue(false);
    36103743    gc->setHelpText(QObject::tr(
    36113744                        "If supported by your hardware/drivers, "
    36123745                        "MythTV will use OpenGL vertical syncing for "
    36133746                        "video timing, reducing frame jitter."));
    3614     return gc;
     3747    return wrap(gc, settings);
    36153748}
    36163749#endif
    36173750
     
    40374170    return gc;
    40384171}
    40394172
    4040 MainGeneralSettings::MainGeneralSettings()
     4173MainGeneralSettings::MainGeneralSettings(PlaySettings *settings,
     4174                                         ConfigurationWizard *base)
    40414175{
     4176    if (!settings)
     4177    {
    40424178    DatabaseSettings::addDatabaseSettings(this);
    40434179
    40444180    VerticalConfigurationGroup *pin =
     
    40914227    remotecontrol->addChild(NetworkControlEnabled());
    40924228    remotecontrol->addChild(NetworkControlPort());
    40934229    addChild(remotecontrol);
     4230    }
    40944231}
    40954232
    4096 PlaybackSettings::PlaybackSettings()
     4233PlaybackSettings::PlaybackSettings(PlaySettings *settings,
     4234                                   ConfigurationWizard *base)
    40974235{
    40984236    uint i = 0, total = 8;
    40994237#if CONFIG_DARWIN
    41004238    total += 2;
    41014239#endif // USING_DARWIN
     4240    if (settings)
     4241        total -= 3;
    41024242
    41034243
    41044244    VerticalConfigurationGroup* general1 =
    41054245        new VerticalConfigurationGroup(false);
    41064246    general1->setLabel(QObject::tr("General Playback") +
    41074247                      QString(" (%1/%2)").arg(++i).arg(total));
     4248    if (settings)
     4249        general1->setLabel(QObject::tr("Playback group settings for ") +
     4250                           settings->mGroupName + " - " +
     4251                           general1->getLabel());
    41084252
    41094253    HorizontalConfigurationGroup *columns =
    41104254        new HorizontalConfigurationGroup(false, false, true, true);
    41114255
    41124256    VerticalConfigurationGroup *column1 =
    41134257        new VerticalConfigurationGroup(false, false, true, true);
    4114     column1->addChild(RealtimePriority());
    4115     column1->addChild(DecodeExtraAudio());
    4116     column1->addChild(JumpToProgramOSD());
     4258    if (!settings)
     4259        column1->addChild(RealtimePriority(settings));
     4260    column1->addChild(DecodeExtraAudio(settings));
     4261    column1->addChild(JumpToProgramOSD(settings));
    41174262    columns->addChild(column1);
    41184263
    41194264    VerticalConfigurationGroup *column2 =
    41204265        new VerticalConfigurationGroup(false, false, true, true);
    4121     column2->addChild(ClearSavedPosition());
    4122     column2->addChild(AltClearSavedPosition());
    4123     column2->addChild(AutomaticSetWatched());
    4124     column2->addChild(ContinueEmbeddedTVPlay());
     4266    column2->addChild(ClearSavedPosition(settings));
     4267    column2->addChild(AltClearSavedPosition(settings));
     4268    column2->addChild(AutomaticSetWatched(settings));
     4269    column2->addChild(ContinueEmbeddedTVPlay(settings));
    41254270    columns->addChild(column2);
    41264271
    41274272    general1->addChild(columns);
    4128     general1->addChild(LiveTVIdleTimeout());
    4129     general1->addChild(AlwaysStreamFiles());
     4273    if (!settings)
     4274        general1->addChild(LiveTVIdleTimeout());
     4275    if (!settings)
     4276        general1->addChild(AlwaysStreamFiles());
    41304277#ifdef USING_OPENGL_VSYNC
    4131     general1->addChild(UseOpenGLVSync());
     4278    general1->addChild(UseOpenGLVSync(settings));
    41324279#endif // USING_OPENGL_VSYNC
    41334280#if defined(USING_XV) || defined(USING_OPENGL_VIDEO) || defined(USING_VDPAU)
    4134     general1->addChild(UsePicControls());
     4281    general1->addChild(UsePicControls(settings));
    41354282#endif // USING_XV
    4136     addChild(general1);
     4283    if (base)
     4284        base->addChild(general1);
     4285    else
     4286        addChild(general1);
    41374287
    41384288    VerticalConfigurationGroup* general2 =
    41394289        new VerticalConfigurationGroup(false);
    41404290    general2->setLabel(QObject::tr("General Playback") +
    41414291                      QString(" (%1/%2)").arg(++i).arg(total));
     4292    if (settings)
     4293        general2->setLabel(QObject::tr("Playback group settings for ") +
     4294                           settings->mGroupName + " - " +
     4295                           general2->getLabel());
    41424296
    41434297    HorizontalConfigurationGroup* oscan =
    41444298        new HorizontalConfigurationGroup(false, false, true, true);
     
    41464300        new VerticalConfigurationGroup(false, false, true, true);
    41474301    VerticalConfigurationGroup *ocol2 =
    41484302        new VerticalConfigurationGroup(false, false, true, true);
    4149     ocol1->addChild(VertScanPercentage());
    4150     ocol1->addChild(YScanDisplacement());
    4151     ocol2->addChild(HorizScanPercentage());
    4152     ocol2->addChild(XScanDisplacement());
     4303    ocol1->addChild(VertScanPercentage(settings));
     4304    ocol1->addChild(YScanDisplacement(settings));
     4305    ocol2->addChild(HorizScanPercentage(settings));
     4306    ocol2->addChild(XScanDisplacement(settings));
    41534307    oscan->addChild(ocol1);
    41544308    oscan->addChild(ocol2);
    41554309
    41564310    HorizontalConfigurationGroup* aspect_fill =
    41574311        new HorizontalConfigurationGroup(false, false, true, true);
    4158     aspect_fill->addChild(AspectOverride());
    4159     aspect_fill->addChild(AdjustFill());
     4312    aspect_fill->addChild(AspectOverride(settings));
     4313    aspect_fill->addChild(AdjustFill(settings));
    41604314
    41614315    general2->addChild(oscan);
    41624316    general2->addChild(aspect_fill);
    4163     general2->addChild(LetterboxingColour());
    4164     general2->addChild(PIPLocationComboBox());
    4165     general2->addChild(PlaybackExitPrompt());
    4166     general2->addChild(EndOfRecordingExitPrompt());
    4167     addChild(general2);
     4317    general2->addChild(LetterboxingColour(settings));
     4318    general2->addChild(PIPLocationComboBox(settings));
     4319    general2->addChild(PlaybackExitPrompt(settings));
     4320    general2->addChild(EndOfRecordingExitPrompt(settings));
     4321    if (base)
     4322        base->addChild(general2);
     4323    else
     4324        addChild(general2);
    41684325
    41694326    QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
    4170     addChild(new PlaybackProfileConfigs(tmp));
     4327    if (base)
     4328        base->addChild(new PlaybackProfileConfigs(tmp, settings));
     4329    else
     4330        addChild(new PlaybackProfileConfigs(tmp, settings));
    41714331
     4332    if (!settings)
     4333    {
    41724334    VerticalConfigurationGroup* pbox = new VerticalConfigurationGroup(false);
    41734335    pbox->setLabel(QObject::tr("View Recordings") +
    41744336                   QString(" (%1/%2)").arg(++i).arg(total));
     
    41964358    pbox3->addChild(DisplayGroupTitleSort());
    41974359    pbox3->addChild(new WatchListSettings());
    41984360    addChild(pbox3);
     4361    }
    41994362
    42004363    VerticalConfigurationGroup* seek = new VerticalConfigurationGroup(false);
    42014364    seek->setLabel(QObject::tr("Seeking") +
    42024365                   QString(" (%1/%2)").arg(++i).arg(total));
    4203     seek->addChild(SmartForward());
    4204     seek->addChild(FFRewReposTime());
    4205     seek->addChild(FFRewReverse());
    4206     seek->addChild(ExactSeeking());
    4207     addChild(seek);
     4366    if (settings)
     4367        seek->setLabel(QObject::tr("Playback group settings for ") +
     4368                       settings->mGroupName + " - " +
     4369                       seek->getLabel());
     4370    seek->addChild(SmartForward(settings));
     4371    seek->addChild(FFRewReposTime(settings));
     4372    seek->addChild(FFRewReverse(settings));
     4373    seek->addChild(ExactSeeking(settings));
     4374    if (base)
     4375        base->addChild(seek);
     4376    else
     4377        addChild(seek);
    42084378
    42094379    VerticalConfigurationGroup* comms = new VerticalConfigurationGroup(false);
    42104380    comms->setLabel(QObject::tr("Commercial Skip") +
    42114381                    QString(" (%1/%2)").arg(++i).arg(total));
    4212     comms->addChild(AutoCommercialSkip());
    4213     comms->addChild(CommRewindAmount());
    4214     comms->addChild(CommNotifyAmount());
     4382    if (settings)
     4383        comms->setLabel(QObject::tr("Playback group settings for ") +
     4384                        settings->mGroupName + " - " +
     4385                        comms->getLabel());
     4386    comms->addChild(AutoCommercialSkip(settings));
     4387    comms->addChild(CommRewindAmount(settings));
     4388    comms->addChild(CommNotifyAmount(settings));
     4389    if (!settings) // these are global settings, not host-specific
     4390    {
    42154391    comms->addChild(MaximumCommercialSkip());
    42164392    comms->addChild(MergeShortCommBreaks());
    42174393    comms->addChild(CommSkipAllBlanks());
    4218     addChild(comms);
     4394    }
     4395    if (base)
     4396        base->addChild(comms);
     4397    else
     4398        addChild(comms);
    42194399
    42204400#if CONFIG_DARWIN
    42214401    VerticalConfigurationGroup* mac1 = new VerticalConfigurationGroup(false);
    42224402    mac1->setLabel(QObject::tr("Mac OS X Video Settings") +
    42234403                   QString(" (%1/%2)").arg(++i).arg(total));
     4404    if (settings)
     4405        mac1->setLabel(QObject::tr("Playback group settings for ") +
     4406                       settings->mGroupName + " - " +
     4407                       mac1->getLabel());
     4408    if (!settings)
     4409    {
    42244410    mac1->addChild(MacGammaCorrect());
    42254411    mac1->addChild(MacScaleUp());
    42264412    mac1->addChild(MacFullSkip());
    4227     addChild(mac1);
     4413    }
     4414    if (base)
     4415        base->addChild(mac1);
     4416    else
     4417        addChild(mac1);
    42284418
    42294419    VerticalConfigurationGroup* mac2 = new VerticalConfigurationGroup(false);
    42304420    mac2->setLabel(QObject::tr("Mac OS X Video Settings") +
    42314421                   QString(" (%1/%2)").arg(++i).arg(total));
     4422    if (settings)
     4423        mac2->setLabel(QObject::tr("Playback group settings for ") +
     4424                       settings->mGroupName + " - " +
     4425                       mac2->getLabel());
     4426    if (!setings)
     4427    {
    42324428    mac2->addChild(new MacMainSettings());
    42334429    mac2->addChild(new MacFloatSettings());
    42344430
     
    42424438#endif
    42434439}
    42444440
    4245 OSDSettings::OSDSettings()
     4441OSDSettings::OSDSettings(PlaySettings *settings,
     4442                         ConfigurationWizard *base)
    42464443{
    42474444    VerticalConfigurationGroup* osd = new VerticalConfigurationGroup(false);
    42484445    osd->setLabel(QObject::tr("On-screen Display"));
     4446    if (settings)
     4447        osd->setLabel(QObject::tr("Playback group settings for ") +
     4448                      settings->mGroupName + " - " +
     4449                      osd->getLabel());
    42494450
    4250     osd->addChild(EnableMHEG());
    4251     osd->addChild(PersistentBrowseMode());
    4252     osd->addChild(BrowseAllTuners());
    4253     osd->addChild(SubtitleCodec());
    4254     osd->addChild(UDPNotifyPort());
    4255     addChild(osd);
     4451    if (!settings)
     4452    {
     4453    osd->addChild(EnableMHEG(settings));
     4454    osd->addChild(PersistentBrowseMode(settings));
     4455    osd->addChild(BrowseAllTuners(settings));
     4456    osd->addChild(SubtitleCodec(settings));
     4457    osd->addChild(UDPNotifyPort(settings));
     4458    }
     4459    if (base)
     4460        base->addChild(osd);
     4461    else
     4462        addChild(osd);
    42564463
    42574464    VerticalConfigurationGroup *cc = new VerticalConfigurationGroup(false);
    42584465    cc->setLabel(QObject::tr("Closed Captions"));
     4466    if (settings)
     4467        cc->setLabel(QObject::tr("Playback group settings for ") +
     4468                     settings->mGroupName + " - " +
     4469                     cc->getLabel());
    42594470    //cc->addChild(DecodeVBIFormat());
    4260     cc->addChild(CCBackground());
    4261     cc->addChild(DefaultCCMode());
    4262     cc->addChild(PreferCC708());
    4263     cc->addChild(OSDCC708TextZoomPercentage());
    4264     addChild(cc);
     4471    cc->addChild(CCBackground(settings));
     4472    cc->addChild(DefaultCCMode(settings));
     4473    cc->addChild(PreferCC708(settings));
     4474    cc->addChild(OSDCC708TextZoomPercentage(settings));
     4475    if (base)
     4476        base->addChild(cc);
     4477    else
     4478        addChild(cc);
    42654479
    42664480#if CONFIG_DARWIN
    42674481    // Any Mac OS-specific OSD stuff would go here.
     
    44044618    VerticalConfigurationGroup* theme = new VerticalConfigurationGroup(false);
    44054619    theme->setLabel(QObject::tr("Theme"));
    44064620
    4407     theme->addChild(new ThemeSelector("Theme"));
     4621    theme->addChild(ThemeSelector("Theme"));
    44084622
    44094623    theme->addChild(ThemePainter());
    44104624    theme->addChild(MenuTheme());
  • programs/mythfrontend/main.cpp

     
    3434#include "globalsettings.h"
    3535#include "profilegroup.h"
    3636#include "playgroup.h"
     37#include "playsettings.h"
    3738#include "networkcontrol.h"
    3839#include "DVDRingBuffer.h"
    3940#include "scheduledrecording.h"
     
    482483        delete statusbox;
    483484}
    484485
     486ConfigurationWizard *createPlaybackSettingsForPlaybackGroup(PlaySettings *settings, ConfigurationWizard *base)
     487{
     488    return new PlaybackSettings(settings, base);
     489}
     490
     491ConfigurationWizard *createOSDSettingsForPlaybackGroup(PlaySettings *settings, ConfigurationWizard *base)
     492{
     493    return new OSDSettings(settings, base);
     494}
     495
     496ConfigurationWizard *createMainGeneralSettingsForPlaybackGroup(PlaySettings *settings, ConfigurationWizard *base)
     497{
     498    return new MainGeneralSettings(settings, base);
     499}
     500
     501static PlayGroupEditor::SettingsLookup pbgroupSetup[] = {
     502    createPlaybackSettingsForPlaybackGroup,
     503    createOSDSettingsForPlaybackGroup,
     504    createMainGeneralSettingsForPlaybackGroup
     505};
     506
    485507void TVMenuCallback(void *data, QString &selection)
    486508{
    487509    (void)data;
     
    574596    }
    575597    else if (sel == "settings playgroup")
    576598    {
    577         PlayGroupEditor editor;
     599        PlayGroupEditor editor(pbgroupSetup,
     600                               sizeof(pbgroupSetup)/sizeof(*pbgroupSetup));
    578601        editor.exec();
    579602    }
    580603    else if (sel == "settings general")
     
    766789            }
    767790        }
    768791        delete tmprbuf;
     792        pginfo->SetPlaybackGroup("Videos");
    769793    }
    770794    else if (pginfo->IsVideo())
     795    {
    771796        pos = pginfo->QueryBookmark();
     797        pginfo->SetPlaybackGroup("Videos");
     798    }
    772799
    773800    if (pos > 0)
    774801    {
  • programs/mythfrontend/globalsettings.h

     
    1313
    1414class QFileInfo;
    1515class AudioDeviceComboBox;
     16class PlaySettings;
    1617
    1718class AudioConfigSettings : public VerticalConfigurationGroup
    1819{
     
    8889class PlaybackSettings : public ConfigurationWizard
    8990{
    9091  public:
    91     PlaybackSettings();
     92    PlaybackSettings(PlaySettings *settings=NULL,
     93                     ConfigurationWizard *base=NULL);
    9294};
    9395
    9496class OSDSettings: virtual public ConfigurationWizard
    9597{
    9698  public:
    97     OSDSettings();
     99    OSDSettings(PlaySettings *settings=NULL,
     100                ConfigurationWizard *base=NULL);
    98101};
    99102
    100103class GeneralSettings : public ConfigurationWizard
     
    118121class MainGeneralSettings : public ConfigurationWizard
    119122{
    120123  public:
    121     MainGeneralSettings();
     124    MainGeneralSettings(PlaySettings *settings=NULL,
     125                        ConfigurationWizard *base=NULL);
    122126};
    123127
    124128class GeneralRecPrioritiesSettings : public ConfigurationWizard
     
    206210    Q_OBJECT
    207211
    208212  public:
    209     PlaybackProfileConfigs(const QString &str);
     213    PlaybackProfileConfigs(const QString &str, PlaySettings *settings);
    210214    virtual ~PlaybackProfileConfigs();
    211215
    212216  private:
     
    218222
    219223  private:
    220224    QStringList   profiles;
    221     HostComboBox *grouptrigger;
     225    ComboBoxSetting *grouptrigger;
    222226};
    223227
    224228#endif
  • programs/mythavtest/main.cpp

     
    2020#include "compat.h"
    2121#include "mythuihelper.h"
    2222#include "dbcheck.h"
     23#include "playsettings.h"
    2324
    2425static void *run_priv_thread(void *data)
    2526{
     
    186187
    187188    GetMythUI()->LoadQtConfig();
    188189
    189 #if defined(Q_OS_MACX)
    190     // Mac OS X doesn't define the AudioOutputDevice setting
    191 #else
    192     QString auddevice = gCoreContext->GetSetting("AudioOutputDevice");
    193     if (auddevice.isEmpty())
    194     {
    195         VERBOSE(VB_IMPORTANT, "Fatal Error: Audio not configured, you need "
    196                 "to run 'mythfrontend', not 'mythtv'.");
    197         return TV_EXIT_NO_AUDIO;
    198     }
    199 #endif
    200 
    201190    MythMainWindow *mainWindow = GetMythMainWindow();
    202191    mainWindow->Init();
    203192
     
    210199        return GENERIC_EXIT_DB_OUTOFDATE;
    211200    }
    212201
    213     TV *tv = new TV();
     202    QString playgroup("");
     203    if (!filename.isEmpty())
     204    {
     205        ProgramInfo pg(filename);
     206        playgroup = pg.GetPlaybackGroup();
     207    }
     208    PlaySettings settings(playgroup);
     209
     210#if defined(Q_OS_MACX)
     211    // Mac OS X doesn't define the AudioOutputDevice setting
     212#else
     213    QString auddevice = settings.GetSetting("AudioOutputDevice", "");
     214    if (auddevice.isEmpty())
     215    {
     216        VERBOSE(VB_IMPORTANT, "Fatal Error: Audio not configured, you need "
     217                "to run 'mythfrontend', not 'mythtv'.");
     218        return TV_EXIT_NO_AUDIO;
     219    }
     220#endif
     221
     222    TV *tv = new TV(&settings);
    214223    if (!tv->Init())
    215224    {
    216225        VERBOSE(VB_IMPORTANT, "Fatal Error: Could not initialize TV class.");