Ticket #8088: 8088_playgroups_v2.patch

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

     
    1616{
    1717  public:
    1818    static void GetRenderOptions(render_opts &opts);
    19     VideoOutputVDPAU(MythCodecID codec_id);
     19    VideoOutputVDPAU(PlaySettings *settings, MythCodecID codec_id);
    2020    ~VideoOutputVDPAU();
    2121    bool Init(int width, int height, float aspect, WId winid,
    2222              int winx, int winy, int winw, int winh, WId embedid = 0);
     
    4949                                    const QSize &video_dim);
    5050    static MythCodecID GetBestSupportedCodec(uint width, uint height,
    5151                                             uint stream_type,
    52                                              bool no_acceleration);
     52                                             bool no_acceleration,
     53                                             PlaySettings *settings);
    5354    DisplayInfo  GetDisplayInfo(void);
    5455    virtual bool IsPIPSupported(void) const { return true; }
    5556    virtual bool IsPBPSupported(void) const { return false; }
  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    5959#include "util-osx-cocoa.h"
    6060#include "mythverbose.h"
    6161#include "myth_imgconvert.h"
     62#include "playsettings.h"
    6263
    6364extern "C" {
    6465#include "vbitext/vbi.h"
     
    231232    // Playback (output) zoom control
    232233    detect_letter_box = new DetectLetterbox(this);
    233234
    234     vbimode = VBIMode::Parse(gContext->GetSetting("VbiFormat"));
    235 
    236     commrewindamount = gContext->GetNumSetting("CommRewindAmount",0);
    237     commnotifyamount = gContext->GetNumSetting("CommNotifyAmount",0);
    238     decode_extra_audio=gContext->GetNumSetting("DecodeExtraAudio", 0);
    239     itvEnabled       = gContext->GetNumSetting("EnableMHEG", 0);
    240     db_prefer708     = gContext->GetNumSetting("Prefer708Captions", 1);
    241     autocommercialskip = (CommSkipMode)
    242         gContext->GetNumSetting("AutoCommercialSkip", kCommSkipOff);
    243 
    244235    lastIgnoredManualSkip = QDateTime::currentDateTime().addSecs(-10);
    245236
    246237    bzero(&txtbuffers, sizeof(txtbuffers));
     
    666657
    667658    if (using_null_videoout)
    668659    {
    669         videoOutput = new VideoOutputNull();
     660        videoOutput = new VideoOutputNull(GetPlaySettings());
    670661        if (!videoOutput->Init(video_disp_dim.width(), video_disp_dim.height(),
    671662                               video_aspect, 0, 0, 0, 0, 0, 0))
    672663        {
     
    715706            pipState,
    716707            video_disp_dim, video_aspect,
    717708            widget->winId(), display_rect, (video_frame_rate * play_speed),
    718             0 /*embedid*/);
     709            0 /*embedid*/, GetPlaySettings());
    719710
    720711        if (!videoOutput)
    721712        {
     
    737728        videoOutput->EmbedInWidget(embx, emby, embw, embh);
    738729    }
    739730
    740     SetCaptionsEnabled(gContext->GetNumSetting("DefaultCCMode"), false);
     731    SetCaptionsEnabled(GetPlaySettings()->GetNumSetting("DefaultCCMode", 0), false);
    741732
    742733    InitFilters();
    743734
     
    788779
    789780void NuppelVideoPlayer::ReinitVideo(void)
    790781{
    791     if (!videoOutput->IsPreferredRenderer(video_disp_dim))
     782    if (!videoOutput->IsPreferredRenderer(video_disp_dim, GetPlaySettings()))
    792783    {
    793784        VERBOSE(VB_PLAYBACK, LOC + QString("Need to switch video renderer."));
    794785        SetErrored(QObject::tr("Need to switch video renderer."));
     
    29202911    refreshrate = 0;
    29212912    lastsync = false;
    29222913
    2923     usevideotimebase = gContext->GetNumSetting("UseVideoTimebase", 0);
     2914    usevideotimebase = GetPlaySettings()->GetNumSetting("UseVideoTimebase", 0);
    29242915
    29252916    if (VERBOSE_LEVEL_CHECK(VB_PLAYBACK))
    29262917        output_jmeter = new Jitterometer("video_output", 100);
     
    29592950        m_double_process = videoOutput->IsExtraProcessingRequired();
    29602951
    29612952        videosync = VideoSync::BestMethod(
    2962             videoOutput, fr_int, rf_int, m_double_framerate);
     2953            videoOutput, GetPlaySettings(), fr_int, rf_int, m_double_framerate);
    29632954
    29642955        // Make sure video sync can do it
    29652956        if (videosync != NULL && m_double_framerate)
     
    34483439        osd->SetListener(m_tv);
    34493440
    34503441        videoOutput->GetOSDBounds(total, visible, aspect, scaling, osd->GetThemeAspect());
    3451         osd->Init(total, frame_interval, visible, aspect, scaling);
     3442        osd->Init(GetPlaySettings(), total, frame_interval, visible, aspect, scaling);
    34523443
    34533444        videoOutput->InitOSD(osd);
    34543445
     
    35223513
    35233514        GetDecoder()->setExactSeeks(seeks);
    35243515
    3525         if (gContext->GetNumSetting("ClearSavedPosition", 1) &&
     3516        if (GetPlaySettings()->GetNumSetting("ClearSavedPosition", 1) &&
    35263517            !player_ctx->IsPIP())
    35273518        {
    35283519            if (player_ctx->buffer->isDVD())
     
    37903781            ++deleteIter;
    37913782            if (deleteIter.key() == totalFrames)
    37923783            {
    3793                 if (!(gContext->GetNumSetting("EndOfRecordingExitPrompt") == 1
     3784                if (!(GetPlaySettings()->GetNumSetting("EndOfRecordingExitPrompt", 0) == 1
    37943785                      && !player_ctx->IsPIP() &&
    37953786                      player_ctx->GetState() == kState_WatchingPreRecorded))
    37963787                {
     
    39643955
    39653956    if (sim_pip_players.isEmpty())
    39663957    {
    3967         return (PIPLocation)gContext->GetNumSetting("PIPLocation", kPIPTopLeft);
     3958        return (PIPLocation)GetPlaySettings()->GetNumSetting("PIPLocation", kPIPTopLeft);
    39683959    }
    39693960
    39703961    // order of preference, could be stored in db if we want it configurable
     
    48214812    exactseeks   = frame_exact_seek;
    48224813    player_ctx   = ctx;
    48234814    livetv       = ctx->tvchain;
     4815
     4816    vbimode = VBIMode::Parse(GetPlaySettings()->GetSetting("VbiFormat", ""));
    48244817}
    48254818
    48264819void NuppelVideoPlayer::SetDeleteIter(void)
     
    74837476{
    74847477    QMutexLocker locker(&subtitleLock);
    74857478    textSubtitles.Clear();
    7486     return TextSubtitleParser::LoadSubtitles(subtitleFileName, textSubtitles);
     7479    return TextSubtitleParser::LoadSubtitles(subtitleFileName, textSubtitles,
     7480                                             GetPlaySettings());
    74877481}
    74887482
    74897483void NuppelVideoPlayer::ChangeDVDTrack(bool ffw)
  • libs/libmythtv/videooutwindow.cpp

     
    3030#include "videooutwindow.h"
    3131#include "osd.h"
    3232#include "osdsurface.h"
     33#include "playsettings.h"
    3334#include "NuppelVideoPlayer.h"
    3435#include "videodisplayprofile.h"
    3536#include "decoderbase.h"
     
    5455const float VideoOutWindow::kManualZoomMinVerticalZoom   = 0.5f;
    5556const int   VideoOutWindow::kManualZoomMaxMove           = 50;
    5657
    57 VideoOutWindow::VideoOutWindow() :
     58VideoOutWindow::VideoOutWindow(PlaySettings *_settings) :
    5859    // DB settings
    5960    db_move(0, 0), db_scale_horiz(0.0f), db_scale_vert(0.0f),
    6061    db_pip_size(26),
     
    8586
    8687    // Various state variables
    8788    embedding(false), needrepaint(false),
    88     allowpreviewepg(true), pip_state(kPIPOff)
     89    allowpreviewepg(true), pip_state(kPIPOff),
     90
     91    settings(_settings)
    8992{
    9093    db_pip_size = gContext->GetNumSetting("PIPSize", 26);
    9194
    92     db_move = QPoint(gContext->GetNumSetting("xScanDisplacement", 0),
    93                      gContext->GetNumSetting("yScanDisplacement", 0));
     95    db_move = QPoint(settings->GetNumSetting("xScanDisplacement", 0),
     96                     settings->GetNumSetting("yScanDisplacement", 0));
    9497    db_use_gui_size = gContext->GetNumSetting("GuiSizeForTV", 0);
    9598
    9699    QDesktopWidget *desktop = NULL;
     
    613616    if (change)
    614617    {
    615618        db_scale_vert =
    616             gContext->GetNumSetting("VertScanPercentage", 0) * 0.01f;
     619            settings->GetNumSetting("VertScanPercentage", 0) * 0.01f;
    617620        db_scale_horiz =
    618             gContext->GetNumSetting("HorizScanPercentage", 0) * 0.01f;
     621            settings->GetNumSetting("HorizScanPercentage", 0) * 0.01f;
    619622        db_scaling_allowed = true;
    620623    }
    621624    else
  • libs/libmythtv/videoout_d3d.cpp

     
    948948    opts.priorities->insert("direct3d", 55);
    949949}
    950950
    951 VideoOutputD3D::VideoOutputD3D(void)
    952   : VideoOutput(),         m_lock(QMutex::Recursive),
     951VideoOutputD3D::VideoOutputD3D(PlaySettings *settings)
     952  : VideoOutput(settings),         m_lock(QMutex::Recursive),
    953953    m_hWnd(NULL),          m_ctx(NULL),
    954954    m_video(NULL),         m_osd(NULL),
    955955    m_d3d_osd(false),      m_osd_ready(false),
  • libs/libmythtv/videoout_opengl.cpp

     
    3838    opts.priorities->insert("opengl", 65);
    3939}
    4040
    41 VideoOutputOpenGL::VideoOutputOpenGL(void)
    42     : VideoOutput(),
     41VideoOutputOpenGL::VideoOutputOpenGL(PlaySettings *settings)
     42    : VideoOutput(settings),
    4343    gl_context_lock(QMutex::Recursive),
    4444    gl_context(NULL), gl_videochain(NULL),
    4545    gl_osdchain(NULL), gl_pipchain_active(NULL),
  • libs/libmythtv/videoout_quartz.cpp

     
    6565#include "videodisplayprofile.h"
    6666#include "videoout_dvdv.h"
    6767
     68class PlaySettings;
     69
    6870#define LOC     QString("VideoOutputQuartz::")
    6971#define LOC_ERR QString("VideoOutputQuartz Error: ")
    7072
     
    11081110/** \class VideoOutputQuartz
    11091111 *  \brief Implementation of Quartz (Mac OS X windowing system) video output
    11101112 */
    1111 VideoOutputQuartz::VideoOutputQuartz(
     1113VideoOutputQuartz::VideoOutputQuartz(PlaySettings *settings
    11121114    MythCodecID _myth_codec_id, void *codec_priv) :
    1113     VideoOutput(), Started(false), data(new QuartzData()),
     1115    VideoOutput(settings), Started(false), data(new QuartzData()),
    11141116    myth_codec_id(_myth_codec_id)
    11151117{
    11161118    init(&pauseFrame, FMT_YV12, NULL, 0, 0, 0, 0);
     
    18151817MythCodecID VideoOutputQuartz::GetBestSupportedCodec(
    18161818    uint width, uint height,
    18171819    uint osd_width, uint osd_height,
    1818     uint stream_type, uint fourcc)
     1820    uint stream_type, uint fourcc, PlaySettings *settings)
    18191821{
    18201822    (void) osd_width;
    18211823    (void) osd_height;
    18221824
    1823     VideoDisplayProfile vdp;
     1825    VideoDisplayProfile vdp(settings);
    18241826    vdp.SetInput(QSize(width, height));
    18251827    QString dec = vdp.GetDecoder();
    18261828    if ((dec == "libmpeg2") || (dec == "ffmpeg"))
  • libs/libmythtv/avformatdecoder.cpp

     
    2828#include "videodisplayprofile.h"
    2929#include "mythuihelper.h"
    3030#include "myth_imgconvert.h"
     31#include "playsettings.h"
    3132
    3233#include "lcddevice.h"
    3334
     
    498499      allow_ac3_passthru(false),    allow_dts_passthru(false),
    499500      internal_vol(false),
    500501      disable_passthru(false),      max_channels(2),
    501       last_ac3_channels(0),         dummy_frame(NULL),
     502      last_ac3_channels(0),         dummy_frame(NULL),
    502503      // DVD
    503504      lastdvdtitle(-1),
    504505      decodeStillFrame(false),
     
    526527
    527528    cc608_build_parity_table(cc608_parity_table);
    528529
    529     if (gContext->GetNumSetting("CCBackground", 0))
     530    if (GetNVP()->GetPlaySettings()->GetNumSetting("CCBackground", 0))
    530531        CC708Window::forceWhiteOnBlackText = true;
    531532
    532533    no_dts_hack = false;
     
    13771378        codec = find_vdpau_decoder(codec, enc->codec_id);
    13781379
    13791380    if (selectedStream &&
    1380         !gContext->GetNumSetting("DecodeExtraAudio", 0) &&
     1381        !GetNVP()->GetPlaySettings()->GetNumSetting("DecodeExtraAudio", 0) &&
    13811382        !CODEC_IS_HWACCEL(codec))
    13821383    {
    13831384        SetLowBuffers(false);
     
    18121813
    18131814                if (!is_db_ignored)
    18141815                {
    1815                     VideoDisplayProfile vdp;
     1816                    VideoDisplayProfile vdp(GetNVP()->GetPlaySettings());
    18161817                    vdp.SetInput(QSize(width, height));
    18171818                    dec = vdp.GetDecoder();
    18181819                    thread_count = vdp.GetMaxCPUs();
     
    18351836                    MythCodecID vdpau_mcid;
    18361837                    vdpau_mcid = VideoOutputVDPAU::GetBestSupportedCodec(
    18371838                        width, height,
    1838                         mpeg_version(enc->codec_id), no_hardware_decoders);
     1839                        mpeg_version(enc->codec_id), no_hardware_decoders,
     1840                        GetNVP()->GetPlaySettings());
    18391841
    18401842                    if (vdpau_mcid >= video_codec_id)
    18411843                    {
     
    18671869                        /* mpeg type    */ mpeg_version(enc->codec_id),
    18681870                        /* xvmc pix fmt */ xvmc_pixel_format(enc->pix_fmt),
    18691871                        /* test surface */ codec_is_std(video_codec_id),
    1870                         /* force_xv     */ force_xv);
     1872                        /* force_xv     */ force_xv,
     1873                        GetNVP()->GetPlaySettings());
    18711874
    18721875                    if (mcid >= video_codec_id)
    18731876                    {
     
    19001903                        /* osd dim      */ 0, 0,
    19011904                        /* mpeg type    */ mpeg_version(enc->codec_id),
    19021905                        /* pixel format */
    1903                         (PIX_FMT_YUV420P == enc->pix_fmt) ? FOURCC_I420 : 0);
     1906                        (PIX_FMT_YUV420P == enc->pix_fmt) ? FOURCC_I420 : 0,
     1907                        GetNVP()->GetPlaySettings());
    19041908
    19051909                    if (quartz_mcid >= video_codec_id)
    19061910                    {
  • libs/libmythtv/osdtypes.cpp

     
    1818#include "mythcontext.h"
    1919#include "mythdialogs.h"
    2020#include "mythverbose.h"
     21#include "playsettings.h"
    2122
    2223#ifdef USING_FRIBIDI
    2324    #include "fribidi/fribidi.h"
     
    23592360//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    23602361
    23612362OSDTypeCC::OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
    2362                      int dispw, int disph, float wmult, float hmult)
     2363                     int dispw, int disph, float wmult, float hmult,
     2364                     PlaySettings *settings)
    23632365         : OSDType(name)
    23642366{
    23652367    m_font = font;
     
    23732375
    23742376    QRect rect = QRect(0, 0, 0, 0);
    23752377    m_box = new OSDTypeBox("cc_background", rect, wmult, hmult);
    2376     m_ccbackground = gContext->GetNumSetting("CCBackground", 0);
     2378    m_ccbackground = settings->GetNumSetting("CCBackground", 0);
    23772379}
    23782380
    23792381OSDTypeCC::~OSDTypeCC()
     
    26032605}
    26042606
    26052607OSDType708CC::OSDType708CC(const QString &name, TTFFont *fonts[48],
    2606                            int xoff, int yoff, int dispw, int disph) :
     2608                          int xoff, int yoff, int dispw, int disph) :
    26072609    OSDType(name)
    26082610{
    26092611    xoffset = xoff;
  • libs/libmythtv/playgroup.cpp

     
    22#include "mythdb.h"
    33#include "playgroup.h"
    44#include "programinfo.h"
     5#include "playsettings.h"
    56
    67// A parameter associated with the profile itself
    78class PlayGroupDBStorage : public SimpleDBStorage
     
    211212    return res;
    212213}
    213214
    214 PlayGroupEditor::PlayGroupEditor(void) :
    215     listbox(new ListBoxSetting(this)), lastValue("Default")
     215PlayGroupEditor::PlayGroupEditor(SettingsLookup pbfunc, SettingsLookup osdfunc) :
     216    listbox(new ListBoxSetting(this)), lastValue("Default"),
     217    getPbSettings(pbfunc), getOsdSettings(osdfunc)
    216218{
    217219    listbox->setLabel(tr("Playback Groups"));
    218220    addChild(listbox);
     
    243245    }
    244246
    245247    PlayGroup group(name);
     248    if (getPbSettings || getOsdSettings)
     249    {
     250        PlaySettings *psettings = new PlaySettings(name);
     251        if (getPbSettings)
     252            getPbSettings(psettings, &group);
     253        if (getOsdSettings)
     254            getOsdSettings(psettings, &group);
     255    }
    246256    if (group.exec() == QDialog::Accepted || !created)
    247257        lastValue = name;
    248258    else
     
    277287        query.bindValue(":NAME", name);
    278288        if (!query.exec())
    279289            MythDB::DBError("PlayGroupEditor::doDelete", query);
     290        PlaySettings::deleteGroup(name);
    280291
    281292        int lastIndex = listbox->getValueIndex(name);
    282293        lastValue = "";
  • libs/libmythtv/libmythtv.pro

     
    179179SOURCES += iso639.cpp
    180180SOURCES += mythsystemevent.cpp
    181181
     182HEADERS += playsettings.h
     183SOURCES += playsettings.cpp
     184
    182185# DiSEqC
    183186HEADERS += diseqc.h                 diseqcsettings.h
    184187SOURCES += diseqc.cpp               diseqcsettings.cpp
  • 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/osdtypes.h

     
    3131class OSDTypeText;
    3232class OSDSurface;
    3333class TV;
     34class PlaySettings;
    3435
    3536typedef QHash<QString,QString> InfoMap;
    3637typedef QMap<int,uint>         HotKeyMap;
     
    573574{
    574575  public:
    575576    OSDTypeCC(const QString &name, TTFFont *font, int xoff, int yoff,
    576               int dispw, int disph, float wmult, float hmult);
     577              int dispw, int disph, float wmult, float hmult,
     578              PlaySettings *settings);
    577579   ~OSDTypeCC();
    578580
    579581    void Reinit(float wmult, float hmult);
  • libs/libmythtv/tv_play.h

     
    5656class TV;
    5757class OSDListTreeItemEnteredEvent;
    5858class OSDListTreeItemSelectedEvent;
     59class PlaySettings;
    5960
    6061typedef QMap<QString,InfoMap>    DDValueMap;
    6162typedef QMap<QString,DDValueMap> DDKeyMap;
     
    179180        unsigned long seconds;
    180181    };
    181182
    182     TV(void);
     183    TV(PlaySettings *settings);
    183184   ~TV();
    184185
    185186    bool Init(bool createWindow = true);
     
    204205
    205206    // Recording commands
    206207    int  PlayFromRecorder(int recordernum);
    207     int  Playback(const ProgramInfo &rcinfo);
     208    int  Playback(const ProgramInfo &rcinfo, PlaySettings *settings);
    208209
    209210    // Commands used by frontend playback box
    210211    QString GetRecordingGroup(int player_idx) const;
     
    593594    static TVState RemoveRecording(TVState state);
    594595    void RestoreScreenSaver(const PlayerContext*);
    595596
    596     void InitUDPNotifyEvent(void);
     597    void InitUDPNotifyEvent(PlaySettings *settings);
    597598
    598599    /// true if dialog is either videoplayexit, playexit or askdelete dialog
    599600    bool IsVideoExitDialog(const QString &dialog_name);
  • 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 pbfunc=0, SettingsLookup osdfunc=0);
    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  getPbSettings;
     51    SettingsLookup  getOsdSettings;
    4752};
    4853
    4954#endif
  • libs/libmythtv/dbcheck.cpp

     
    35693569
    35703570            VideoDisplayProfile::CreateNewProfiles(host);
    35713571            profiles = VideoDisplayProfile::GetProfiles(host);
    3572             QString profile = VideoDisplayProfile::GetDefaultProfileName(host);
     3572            QString profile = VideoDisplayProfile::GetDefaultProfileName(host, NULL);
    35733573
    35743574            if (profiles.contains("Normal") &&
    35753575                (profile=="CPU++" || profile=="CPU+" || profile=="CPU--"))
     
    56375637"  jump int(11) NOT NULL default '0',"
    56385638"  PRIMARY KEY  (`name`)"
    56395639");",
     5640"CREATE TABLE playgroupsettings ("
     5641"  playgroupname varchar(64) NOT NULL,"
     5642"  `value` varchar(128) NOT NULL,"
     5643"  `data` text,"
     5644"  overridden tinyint(1) NOT NULL,"
     5645"  PRIMARY KEY (playgroupname, `value`)"
     5646");",
    56405647"CREATE TABLE powerpriority ("
    56415648"  priorityname varchar(64) collate utf8_bin NOT NULL,"
    56425649"  recpriority int(10) NOT NULL default '0',"
  • libs/libmythtv/videoout_vdpau.cpp

     
    4646    opts.deints->insert("vdpau", deints);
    4747}
    4848
    49 VideoOutputVDPAU::VideoOutputVDPAU(MythCodecID codec_id)
    50   : VideoOutput(),
     49VideoOutputVDPAU::VideoOutputVDPAU(PlaySettings *settings, MythCodecID codec_id)
     50  : VideoOutput(settings),
    5151    m_codec_id(codec_id),    m_win(0),         m_render(NULL),
    5252    m_buffer_size(NUM_VDPAU_BUFFERS),          m_pause_surface(0),
    5353    m_need_deintrefs(false), m_video_mixer(0), m_mixer_features(kVDPFeatNone),
     
    857857
    858858MythCodecID VideoOutputVDPAU::GetBestSupportedCodec(
    859859    uint width,       uint height,
    860     uint stream_type, bool no_acceleration)
     860    uint stream_type, bool no_acceleration, PlaySettings *settings)
    861861{
    862862    bool use_cpu = no_acceleration;
    863     VideoDisplayProfile vdp;
     863    VideoDisplayProfile vdp(settings);
    864864    vdp.SetInput(QSize(width, height));
    865865    QString dec = vdp.GetDecoder();
    866866
  • libs/libmythtv/videoout_directfb.cpp

     
    274274    opts.priorities->insert("directfb", 60);
    275275}
    276276
    277 VideoOutputDirectfb::VideoOutputDirectfb(void)
    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/videoout_d3d.h

     
    9393{
    9494  public:
    9595    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    96     VideoOutputD3D();
     96    VideoOutputD3D(PlaySettings *settings);
    9797   ~VideoOutputD3D();
    9898
    9999    bool Init(int width, int height, float aspect, WId winid,
  • libs/libmythtv/playercontext.cpp

     
    1414#include "videoouttypes.h"
    1515#include "storagegroup.h"
    1616#include "mythcontext.h"
     17#include "playsettings.h"
    1718
    1819#define LOC QString("playCtx: ")
    1920#define LOC_ERR QString("playCtx, Error: ")
     
    435436                              WId embedwinid, const QRect *embedbounds,
    436437                              bool muted)
    437438{
    438     int exact_seeking = gContext->GetNumSetting("ExactSeeking", 0);
     439    int exact_seeking = settings->GetNumSetting("ExactSeeking", 0);
    439440
    440441    if (HasNVP())
    441442    {
     
    450451        _nvp->DisableHardwareDecoders();
    451452
    452453    _nvp->SetPlayerInfo(tv, widget, exact_seeking, this);
     454    _nvp->commrewindamount = settings->GetNumSetting("CommRewindAmount", 0);
     455    _nvp->commnotifyamount = settings->GetNumSetting("CommNotifyAmount", 0);
     456    _nvp->decode_extra_audio = settings->GetNumSetting("DecodeExtraAudio", 0);
     457    _nvp->itvEnabled = settings->GetNumSetting("EnableMHEG", 0);
     458    _nvp->db_prefer708 = settings->GetNumSetting("Prefer708Captions", 1);
    453459    _nvp->SetAudioInfo(gContext->GetSetting("AudioOutputDevice"),
    454460                       gContext->GetSetting("PassThruOutputDevice"),
    455461                       gContext->GetNumSetting("AudioSampleRate", 44100));
     
    888894/**
    889895 * \brief assign programinfo to the context
    890896 */
    891 void PlayerContext::SetPlayingInfo(const ProgramInfo *info)
     897void PlayerContext::SetPlayingInfo(const ProgramInfo *info, PlaySettings *_settings)
    892898{
    893899    bool ignoreDB = gContext->IsDatabaseIgnored();
    894900
     
    900906            playingInfo->MarkAsInUse(false);
    901907        delete playingInfo;
    902908        playingInfo = NULL;
     909        // XXX delete settings?
    903910    }
    904911
    905912    if (info)
     
    908915        if (!ignoreDB)
    909916            playingInfo->MarkAsInUse(true, recUsage);
    910917        playingLen  = playingInfo->CalculateLength();
     918        settings = (_settings ? _settings : new PlaySettings(playingInfo->playgroup));
    911919    }
    912920}
    913921
  • libs/libmythtv/NuppelVideoPlayer.h

     
    196196    bool      GetAudioBufferStatus(uint &fill, uint &total) const;
    197197    PIPLocation GetNextPIPLocation(void) const;
    198198
     199    PlaySettings *GetPlaySettings(void) const {
     200        return player_ctx ? player_ctx->settings : NULL;
     201    }
     202
    199203    // Bool Gets
    200204    bool    GetRawAudioState(void) const;
    201205    bool    GetLimitKeyRepeat(void) const     { return limitKeyRepeat; }
  • libs/libmythtv/textsubtitleparser.h

     
    1717// Qt headers
    1818#include <QStringList>
    1919
     20class PlaySettings;
     21
    2022class text_subtitle_t
    2123{
    2224  public:
     
    7577class TextSubtitleParser
    7678{
    7779  public:
    78     static bool LoadSubtitles(QString fileName, TextSubtitles &target);
     80    static bool LoadSubtitles(QString fileName, TextSubtitles &target,
     81                              PlaySettings *settings);
    7982};
    8083
    8184#endif
  • libs/libmythtv/osd.h

     
    7070class TeletextViewer;
    7171class QStringList;
    7272class QDomElement;
     73class PlaySettings;
    7374
    7475class OSD : public QObject
    7576{
     
    7879    OSD();
    7980   ~OSD(void);
    8081
    81     void Init(const QRect &totalBounds,   int   frameRate,
     82    void Init(PlaySettings *settings, const QRect &totalBounds,   int   frameRate,
    8283        const QRect &visibleBounds, float visibleAspect, float fontScaling);
    8384
    8485    OSDSurface *Display(void);
     
    278279    OSDListTreeType *runningTreeMenu;
    279280    QString treeMenuContainer;
    280281
     282    PlaySettings *settings;
     283
    281284    // EIA-708 captions
    282285    QString fontname;
    283286    QString ccfontname;
  • libs/libmythtv/vsync.cpp

     
    3434#include "mythcontext.h"
    3535#include "mythverbose.h"
    3636#include "mythmainwindow.h"
     37#include "playsettings.h"
    3738
    3839#ifdef USING_XV
    3940#include "videoout_xv.h"
     
    7677 *  \brief Returns the most sophisticated video sync method available.
    7778 */
    7879VideoSync *VideoSync::BestMethod(VideoOutput *video_output,
     80                                 PlaySettings *settings,
    7981                                 uint frame_interval, uint refresh_interval,
    8082                                 bool halve_frame_interval)
    8183{
    8284    VideoSync *trial = NULL;
    8385    tryingVideoSync  = true;
    84     bool tryOpenGL   = (gContext->GetNumSetting("UseOpenGLVSync", 1) &&
     86    bool tryOpenGL   = (settings->GetNumSetting("UseOpenGLVSync", 1) &&
    8587                        (getenv("NO_OPENGL_VSYNC") == NULL));
    8688
    8789    // m_forceskip allows for skipping one sync method
  • libs/libmythtv/tv_play.cpp

     
    6060#include "tv_play_win.h"
    6161#include "recordinginfo.h"
    6262#include "mythsystemevent.h"
     63#include "playsettings.h"
    6364
    6465#if ! HAVE_ROUND
    6566#define round(x) ((int) ((x) + 0.5))
     
    190191                 bool inPlaylist, bool initByNetworkCommand)
    191192{
    192193    VERBOSE(VB_PLAYBACK, LOC + "StartTV() -- begin");
    193     TV *tv = new TV();
    194194    bool quitAll = false;
    195195    bool showDialogs = true;
    196196    bool playCompleted = false;
     
    201201    if (tvrec)
    202202        curProgram = new ProgramInfo(*tvrec);
    203203
     204    PlaySettings settings(curProgram ? curProgram->playgroup : "Default");
     205    TV *tv = new TV(&settings);
     206
    204207    // Initialize TV
    205208    if (!tv->Init())
    206209    {
     
    231234        if (curProgram)
    232235        {
    233236            VERBOSE(VB_PLAYBACK, LOC + "tv->Playback() -- begin");
    234             if (!tv->Playback(*curProgram))
     237            if (!tv->Playback(*curProgram, &settings))
    235238            {
    236239                quitAll = true;
    237240            }
     
    783786 *  \brief Performs instance initialiation not requiring access to database.
    784787 *  \sa Init(void)
    785788 */
    786 TV::TV(void)
     789TV::TV(PlaySettings *settings)
    787790    : // Configuration variables from database
    788791      baseFilters(""),
    789792      db_channel_format("<num> <sign>"),
     
    921924        kv[QString("FFRewSpeed%1").arg(i)] = QString::number(ff_rew_def[i]);
    922925
    923926    MythDB::getMythDB()->GetSettings(kv);
     927    settings->AddToMap(kv);
    924928
    925929    // convert from minutes to ms.
    926930    db_idle_timeout        = kv["LiveTVIdleTimeout"].toInt() * 60 * 1000;
     
    934938    db_use_gui_size_for_tv = kv["GuiSizeForTV"].toInt();
    935939    db_start_in_guide      = kv["WatchTVGuide"].toInt();
    936940    db_toggle_bookmark     = kv["AltClearSavedPosition"].toInt();
     941    VERBOSE(VB_GENERAL, QString("db_toggle_bookmark=%1").arg(db_toggle_bookmark));
    937942    db_run_jobs_on_remote  = kv["JobsRunOnRecordHost"].toInt();
    938943    db_use_dvd_bookmark    = kv["EnableDVDBookmark"].toInt();
    939944    db_continue_embedded   = kv["ContinueEmbeddedTVPlay"].toInt();
     
    17111716}
    17121717
    17131718
    1714 int TV::Playback(const ProgramInfo &rcinfo)
     1719int TV::Playback(const ProgramInfo &rcinfo, PlaySettings *settings)
    17151720{
    17161721    wantsToQuit   = false;
    17171722    jumpToProgram = false;
     
    17251730        return 0;
    17261731    }
    17271732
    1728     mctx->SetPlayingInfo(&rcinfo);
     1733    mctx->SetPlayingInfo(&rcinfo, settings);
    17291734    mctx->SetInitialTVState(false);
    17301735    ScheduleStateChange(mctx);
    17311736
     
    18081813
    18091814    if (fileexists)
    18101815    {
    1811         Playback(pginfo);
     1816        PlaySettings settings("Default");
     1817        Playback(pginfo, &settings);
    18121818        retval = 1;
    18131819    }
    18141820
     
    21532159        {
    21542160            OSD *osd = GetOSDLock(ctx);
    21552161            ctx->LockPlayingInfo(__FILE__, __LINE__);
    2156             if (osd && (PlayGroup::GetCount() > 0))
     2162            if (ctx->playingInfo->playgroup != "Default" && osd && (PlayGroup::GetCount() > 0))
    21572163                osd->SetSettingsText(tr("%1 Settings")
    21582164                    .arg(tv_i18n(ctx->playingInfo->playgroup)), 3);
    21592165            ctx->UnlockPlayingInfo(__FILE__, __LINE__);
     
    51655171        return false;
    51665172    }
    51675173
    5168     InitUDPNotifyEvent();
     5174    InitUDPNotifyEvent(ctx->settings);
    51695175    bool ok = false;
    51705176    if (ctx->IsNullVideoDesired())
    51715177    {
     
    1181711823        GetMythUI()->RestoreScreensaver();
    1181811824}
    1181911825
    11820 void TV::InitUDPNotifyEvent(void)
     11826void TV::InitUDPNotifyEvent(PlaySettings *settings)
    1182111827{
    1182211828    if (db_udpnotify_port && !udpnotify)
    1182311829    {
    11824         udpnotify = new UDPNotify(db_udpnotify_port);
     11830        udpnotify = new UDPNotify(db_udpnotify_port, settings);
    1182511831        connect(udpnotify,
    1182611832                SIGNAL(AddUDPNotifyEvent(
    1182711833                        const QString&,const UDPNotifyOSDSet*)),
  • 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);
     
    121123    static QString     GetDecoderName(const QString &decoder);
    122124    static QString     GetDecoderHelp(QString decoder = QString::null);
    123125
    124     static QString     GetDefaultProfileName(const QString &hostname);
     126    static QString     GetDefaultProfileName(const QString &hostname,
     127                                             PlaySettings *settings);
    125128    static void        SetDefaultProfileName(const QString &profilename,
    126129                                             const QString &hostname);
    127130    static uint        GetProfileGroupID(const QString &profilename,
  • libs/libmythtv/videoout_null.cpp

     
    2727    opts.priorities->insert("null", 10);
    2828}
    2929
    30 VideoOutputNull::VideoOutputNull(void) :
    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 "NuppelVideoPlayer.h"
    88#include "videodisplayprofile.h"
    99#include "decoderbase.h"
     10#include "playsettings.h"
    1011
    1112#include "mythcontext.h"
    1213#include "mythverbose.h"
     
    107108        PIPState pipState,
    108109        const QSize   &video_dim, float        video_aspect,
    109110        WId            win_id,    const QRect &display_rect,
    110         float          video_prate,     WId    embed_id)
     111        float          video_prate,     WId    embed_id,
     112        PlaySettings *settings)
    111113{
    112114    (void) codec_priv;
    113115
     
    152154    QString renderer = QString::null;
    153155    if (renderers.size() > 0)
    154156    {
    155         VideoDisplayProfile vprof;
     157        VideoDisplayProfile vprof(settings);
    156158        vprof.SetInput(video_dim);
    157159
    158160        QString tmp = vprof.GetVideoRenderer();
     
    180182
    181183#ifdef USING_DIRECTFB
    182184        if (renderer == "directfb")
    183             vo = new VideoOutputDirectfb();
     185            vo = new VideoOutputDirectfb(settings);
    184186#endif // USING_DIRECTFB
    185187
    186188#ifdef USING_MINGW
    187189        if (renderer == "direct3d")
    188             vo = new VideoOutputD3D();
     190            vo = new VideoOutputD3D(settings);
    189191#endif // USING_MINGW
    190192
    191193#ifdef Q_OS_MACX
    192194        if (osxlist.contains(renderer))
    193             vo = new VideoOutputQuartz(codec_id, codec_priv);
     195            vo = new VideoOutputQuartz(settings, codec_id, codec_priv);
    194196#endif // Q_OS_MACX
    195197
    196198#ifdef USING_OPENGL_VIDEO
    197199        if (renderer == "opengl")
    198             vo = new VideoOutputOpenGL();
     200            vo = new VideoOutputOpenGL(settings);
    199201#endif // USING_OPENGL_VIDEO
    200202
    201203#ifdef USING_VDPAU
    202204        if (renderer == "vdpau")
    203             vo = new VideoOutputVDPAU(codec_id);
     205            vo = new VideoOutputVDPAU(settings, codec_id);
    204206#endif // USING_VDPAU
    205207
    206208#ifdef USING_XV
    207209        if (xvlist.contains(renderer))
    208             vo = new VideoOutputXv(codec_id);
     210            vo = new VideoOutputXv(settings, codec_id);
    209211#endif // USING_XV
    210212
    211213        if (vo)
     
    302304 * \brief This constructor for VideoOutput must be followed by an
    303305 *        Init(int,int,float,WId,int,int,int,int,WId) call.
    304306 */
    305 VideoOutput::VideoOutput() :
     307VideoOutput::VideoOutput(PlaySettings *_settings) :
    306308    // DB Settings
    307309    db_display_dim(0,0),
    308310    db_aspectoverride(kAspect_Off),     db_adjustfill(kAdjustFill_Off),
     
    336338    display_res(NULL),
    337339
    338340    // Physical display
    339     monitor_sz(640,480),                monitor_dim(400,300)
     341    monitor_sz(640,480),                monitor_dim(400,300),
    340342
     343    settings(_settings)
     344
    341345{
    342346    bzero(&pip_tmp_image, sizeof(pip_tmp_image));
    343     db_display_dim = QSize(gContext->GetNumSetting("DisplaySizeWidth",  0),
    344                            gContext->GetNumSetting("DisplaySizeHeight", 0));
     347    db_display_dim = QSize(settings->GetNumSetting("DisplaySizeWidth",  0),
     348                           settings->GetNumSetting("DisplaySizeHeight", 0));
    345349
    346350    db_pict_attr[kPictureAttribute_Brightness] =
    347         gContext->GetNumSetting("PlaybackBrightness", 50);
     351        settings->GetNumSetting("PlaybackBrightness", 50);
    348352    db_pict_attr[kPictureAttribute_Contrast] =
    349         gContext->GetNumSetting("PlaybackContrast",   50);
     353        settings->GetNumSetting("PlaybackContrast",   50);
    350354    db_pict_attr[kPictureAttribute_Colour] =
    351         gContext->GetNumSetting("PlaybackColour",     50);
     355        settings->GetNumSetting("PlaybackColour",     50);
    352356    db_pict_attr[kPictureAttribute_Hue] =
    353         gContext->GetNumSetting("PlaybackHue",         0);
     357        settings->GetNumSetting("PlaybackHue",         0);
    354358
    355359    db_aspectoverride = (AspectOverrideMode)
    356         gContext->GetNumSetting("AspectOverride",      0);
     360        settings->GetNumSetting("AspectOverride",      0);
    357361    db_adjustfill = (AdjustFillMode)
    358         gContext->GetNumSetting("AdjustFill",          0);
     362        settings->GetNumSetting("AdjustFill",          0);
    359363    db_letterbox_colour = (LetterBoxColour)
    360         gContext->GetNumSetting("LetterboxColour",     0);
     364        settings->GetNumSetting("LetterboxColour",     0);
    361365    db_use_picture_controls =
    362         gContext->GetNumSetting("UseOutputPictureControls", 0);
     366        settings->GetNumSetting("UseOutputPictureControls", 0);
    363367
    364368    if (!gContext->IsDatabaseIgnored())
    365         db_vdisp_profile = new VideoDisplayProfile();
     369        db_vdisp_profile = new VideoDisplayProfile(settings);
    366370
    367     windows.push_back(VideoOutWindow());
     371    windows.push_back(VideoOutWindow(settings));
    368372}
    369373
    370374/**
     
    433437    return QString::null;
    434438}
    435439
    436 bool VideoOutput::IsPreferredRenderer(QSize video_size)
     440bool VideoOutput::IsPreferredRenderer(QSize video_size, PlaySettings *settings)
    437441{
    438442    if (!db_vdisp_profile || (video_size == windows[0].GetVideoDispDim()))
    439443        return true;
    440444
    441     VideoDisplayProfile vdisp;
     445    VideoDisplayProfile vdisp(settings);
    442446    vdisp.SetInput(video_size);
    443447    QString new_rend = vdisp.GetVideoRenderer();
    444448    if (new_rend.isEmpty())
  • libs/libmythtv/videooutwindow.h

     
    1616#include "videoouttypes.h"
    1717
    1818class NuppelVideoPlayer;
     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

     
    2727class LiveTVChain;
    2828class MythDialog;
    2929class QPainter;
     30class PlaySettings;
    3031
    3132typedef enum
    3233{
     
    9091    void SetRecorder(RemoteEncoder *rec);
    9192    void SetTVChain(LiveTVChain *chain);
    9293    void SetRingBuffer(RingBuffer *buf);
    93     void SetPlayingInfo(const ProgramInfo *info);
     94    void SetPlayingInfo(const ProgramInfo *info, PlaySettings *settings=NULL);
    9495    void SetPlayGroup(const QString &group);
    9596    void SetPseudoLiveTV(const ProgramInfo *pi, PseudoState new_state);
    9697    void SetPIPLocation(int loc) { pipLocation = loc; }
     
    145146    LiveTVChain        *tvchain;
    146147    RingBuffer         *buffer;
    147148    ProgramInfo        *playingInfo; ///< Currently playing info
     149    PlaySettings       *settings; // corresponding to playingInfo
    148150    long long           playingLen;  ///< Initial CalculateLength()
    149151    bool                nohardwaredecoders; // < Disable use of VDPAU decoding
    150152    bool                decoding;    ///< Video decoder thread started
  • libs/libmythtv/vsync.h

     
    101101
    102102    // documented in vsync.cpp
    103103    static VideoSync *BestMethod(VideoOutput*,
     104                                 PlaySettings *settings,
    104105                                 uint frame_interval, uint refresh_interval,
    105106                                 bool interlaced);
    106107  protected:
  • libs/libmythtv/videoout_xv.h

     
    5151    friend class XvMCOSD;
    5252  public:
    5353    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    54     VideoOutputXv(MythCodecID av_codec_id);
     54    VideoOutputXv(PlaySettings *settings, MythCodecID av_codec_id);
    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

     
    166166 * \see VideoOutput, VideoBuffers
    167167 *
    168168 */
    169 VideoOutputXv::VideoOutputXv(MythCodecID codec_id)
    170     : VideoOutput(),
     169VideoOutputXv::VideoOutputXv(PlaySettings *settings, MythCodecID codec_id)
     170    : VideoOutput(settings),
    171171      myth_codec_id(codec_id), video_output_subtype(XVUnknown),
    172172      global_lock(QMutex::Recursive),
    173173
     
    408408 * \return port number if it succeeds, else -1.
    409409 */
    410410int VideoOutputXv::GrabSuitableXvPort(MythXDisplay* disp, Window root,
     411                                      PlaySettings *settings,
    411412                                      MythCodecID mcodecid,
    412413                                      uint width, uint height,
    413414                                      bool &xvsetdefaults,
     
    492493    }
    493494
    494495    // figure out if we want chromakeying..
    495     VideoDisplayProfile vdp;
     496    VideoDisplayProfile vdp(settings);
    496497    vdp.SetInput(QSize(width, height));
    497498    bool check_for_colorkey = (vdp.GetOSDRenderer() == "chromakey");
    498499
     
    785786    disp->StartLog();
    786787    QString adaptor_name = QString::null;
    787788    const QSize video_dim = windows[0].GetVideoDim();
    788     xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), mcodecid,
     789    xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), settings, mcodecid,
    789790                                 video_dim.width(), video_dim.height(),
    790791                                 xv_set_defaults,
    791792                                 xvmc_chroma, &xvmc_surf_info, &adaptor_name);
     
    864865    disp->StartLog();
    865866    QString adaptor_name = QString::null;
    866867    const QSize video_dim = windows[0].GetVideoDim();
    867     xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), kCodec_MPEG2,
     868    xv_port = GrabSuitableXvPort(disp, disp->GetRoot(), settings, kCodec_MPEG2,
    868869                                 video_dim.width(), video_dim.height(),
    869870                                 xv_set_defaults, 0, NULL, &adaptor_name);
    870871    if (xv_port == -1)
     
    10181019    uint width,       uint height,
    10191020    uint osd_width,   uint osd_height,
    10201021    uint stream_type, int xvmc_chroma,
    1021     bool test_surface, bool force_xv)
     1022    bool test_surface, bool force_xv,
     1023    PlaySettings *settings)
    10221024{
    10231025    (void)width, (void)height, (void)osd_width, (void)osd_height;
    10241026    (void)stream_type, (void)xvmc_chroma, (void)test_surface;
     
    10291031        return ret;
    10301032
    10311033#ifdef USING_XVMC
    1032     VideoDisplayProfile vdp;
     1034    VideoDisplayProfile vdp(settings);
    10331035    vdp.SetInput(QSize(width, height));
    10341036    QString dec = vdp.GetDecoder();
    10351037    if ((dec == "libmpeg2") || (dec == "ffmpeg"))
     
    10791081
    10801082        ok = false;
    10811083        bool dummy;
    1082         int port = GrabSuitableXvPort(disp, disp->GetRoot(), ret, width, height,
     1084        int port = GrabSuitableXvPort(disp, disp->GetRoot(), settings, ret, width, height,
    10831085                                      dummy, xvmc_chroma, &info);
    10841086        if (port >= 0)
    10851087        {
  • libs/libmythtv/udpnotify.cpp

     
    3131#include "udpnotify.h"
    3232#include "mythcontext.h"
    3333#include "mythverbose.h"
     34#include "playsettings.h"
    3435
    3536UDPNotifyOSDSet::UDPNotifyOSDSet(const QString &name, uint timeout)
    3637    : m_name(name), m_timeout(timeout)
     
    7374
    7475/////////////////////////////////////////////////////////////////////////
    7576
    76 UDPNotify::UDPNotify(uint udp_port) :
     77UDPNotify::UDPNotify(uint udp_port, PlaySettings *settings) :
    7778    m_socket(new QUdpSocket()), m_db_osd_udpnotify_timeout(5)
    7879{
    7980    connect(m_socket, SIGNAL(readyRead()),
     
    8182
    8283    m_socket->bind(udp_port);
    8384
    84     m_db_osd_udpnotify_timeout = gContext->GetNumSetting("OSDNotifyTimeout", 5);
     85    m_db_osd_udpnotify_timeout = settings->GetNumSetting("OSDNotifyTimeout", 5);
    8586}
    8687
    8788void UDPNotify::deleteLater(void)
  • libs/libmythtv/videooutbase.h

     
    2929class FilterChain;
    3030class FilterManager;
    3131class OpenGLContextGLX;
     32class PlaySettings;
    3233
    3334typedef QMap<NuppelVideoPlayer*,PIPLocation> PIPMap;
    3435
     
    4950        PIPState       pipState,
    5051        const QSize   &video_dim, float        video_aspect,
    5152        WId            win_id,    const QRect &display_rect,
    52         float video_prate,        WId          embed_id);
     53        float video_prate,        WId          embed_id,
     54        PlaySettings *settings);
    5355
    54     VideoOutput();
     56    VideoOutput(PlaySettings *settings);
    5557    virtual ~VideoOutput();
    5658
    5759    virtual bool Init(int width, int height, float aspect,
     
    5961                      int winh, WId embedid = 0);
    6062    virtual void InitOSD(OSD *osd);
    6163    virtual void SetVideoFrameRate(float);
    62     virtual bool IsPreferredRenderer(QSize video_size);
     64    virtual bool IsPreferredRenderer(QSize video_size, PlaySettings *settings);
    6365    virtual bool SetDeinterlacingEnabled(bool);
    6466    virtual bool SetupDeinterlace(bool i, const QString& ovrf="");
    6567    virtual void FallbackDeint(void);
     
    328330    // Display information
    329331    QSize monitor_sz;
    330332    QSize monitor_dim;
     333
     334    PlaySettings *settings;
    331335};
    332336
    333337#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)
     
    112113    m_subtitles.clear();
    113114}
    114115
    115 bool TextSubtitleParser::LoadSubtitles(QString fileName, TextSubtitles &target)
     116bool TextSubtitleParser::LoadSubtitles(QString fileName, TextSubtitles &target,
     117                                       PlaySettings *settings)
    116118{
    117119    demux_sputext_t sub_data;
    118120    sub_data.rbuffer = new RingBuffer(fileName, 0, false);
     
    130132    target.SetFrameBasedTiming(!sub_data.uses_time);
    131133
    132134    QTextCodec *textCodec = NULL;
    133     QString codec = gContext->GetSetting("SubtitleCodec", "");
     135    QString codec = settings->GetSetting("SubtitleCodec", "");
    134136    if (!codec.isEmpty())
    135137        textCodec = QTextCodec::codecForName(codec.toLatin1());
    136138    if (!textCodec)
  • libs/libmythtv/osd.cpp

     
    3232#include "mythverbose.h"
    3333#include "util.h"
    3434#include "channelutil.h"
     35#include "playsettings.h"
    3536
    3637#include "x11colors.h"
    3738#include "mythdirs.h"
     
    4243static char  *cc708_default_font_names[16];
    4344static bool   cc708_defaults_initialized = false;
    4445static QMutex cc708_init_lock;
    45 static void initialize_osd_fonts(void);
     46static void initialize_osd_fonts(PlaySettings *settings);
    4647
    4748#define LOC QString("OSD: ")
    4849#define LOC_ERR QString("OSD, Error: ")
     
    7677    editarrowRect(),                    drawSurface(NULL),
    7778    changed(false),                     runningTreeMenu(NULL),
    7879    treeMenuContainer(""),
     80    settings(NULL),
    7981    // EIA-608 captions
    8082    fontname(""),                       ccfontname(""),
    8183    fontSizeType(""),
     
    155157    }
    156158}
    157159
    158 void OSD::Init(const QRect &osd_bounds, int   frameRate,
     160void OSD::Init(PlaySettings *_settings, const QRect &osd_bounds, int   frameRate,
    159161         const QRect &vis_bounds, float visibleAspect, float fontScaling)
    160162{
     163    settings = _settings;
    161164    removeHTML.setMinimal(true);
    162165
    163166    fscale = fontScaling;
     
    172175    drawSurface = new OSDSurface(osd_bounds.width(), osd_bounds.height());
    173176
    174177    if (!cc708_defaults_initialized)
    175         initialize_osd_fonts();
     178        initialize_osd_fonts(settings);
    176179
    177180    for (uint i = 0; i < 16; i++)
    178181        cc708fontnames[i] = cc708_default_font_names[i];
     
    238241        QString name = "cc_font";
    239242        int fontsize = m_themeinfo->BaseRes()->height() / 27;
    240243
    241         ccfont = LoadFont(gContext->GetSetting("OSDCCFont"), fontsize);
     244        ccfont = LoadFont(settings->GetSetting("OSDCCFont", ""), fontsize);
    242245
    243246        if (ccfont)
    244247            fontMap[name] = ccfont;
     
    274277
    275278    OSDTypeCC *ccpage =
    276279        new OSDTypeCC(name, ccfont, sub_xoff, sub_yoff,
    277                       sub_dispw, sub_disph, wmult, hmult);
     280                      sub_dispw, sub_disph, wmult, hmult, settings);
    278281    container->AddType(ccpage);
    279282    return true;
    280283}
     
    293296
    294297    // Create fonts...
    295298    TTFFont* ccfonts[48];
    296     uint z = gContext->GetNumSetting("OSDCC708TextZoom", 100) *
     299    uint z = settings->GetNumSetting("OSDCC708TextZoom", 100) *
    297300                    m_themeinfo->BaseRes()->height();
    298301    uint fontsizes[3] = { z / 3600, z / 2900, z / 2200 };
    299302    for (uint i = 0; i < 48; i++)
     
    356359    if (!font)
    357360    {
    358361        int fontsize = 440 / 26;
    359         font = LoadFont(gContext->GetSetting("OSDCCFont"), fontsize);
     362        font = LoadFont(settings->GetSetting("OSDCCFont", ""), fontsize);
    360363
    361364        if (font)
    362365            fontMap[fontname] = font;
     
    464467    TTFFont *font = GetFont(fontname);
    465468    if (!font)
    466469    {
    467         font = LoadFont(gContext->GetSetting("OSDCCFont"), SUBTITLE_FONT_SIZE);
     470        font = LoadFont(settings->GetSetting("OSDCCFont", ""), SUBTITLE_FONT_SIZE);
    468471
    469472        if (font)
    470473        {
     
    532535
    533536    if (!actfont)
    534537    {
    535         actfont = LoadFont(gContext->GetSetting("OSDFont"), 16);
     538        actfont = LoadFont(settings->GetSetting("OSDFont", ""), 16);
    536539
    537540        if (actfont)
    538541            fontMap["treemenulistfont"] = actfont;
     
    848851void OSD::parseFont(QDomElement &element)
    849852{
    850853    QString name;
    851     QString fontfile = gContext->GetSetting("OSDFont");
     854    QString fontfile = settings->GetSetting("OSDFont", "");
    852855    int size = -1;
    853856    int sizeSmall = -1;
    854857    int sizeBig = -1;   
     
    926929        return;
    927930    }
    928931
    929     QString fontSizeType = gContext->GetSetting("OSDThemeFontSizeType",
     932    QString fontSizeType = settings->GetSetting("OSDThemeFontSizeType",
    930933                                                "default");
    931934    if (fontSizeType == "small")
    932935    {
     
    31073110    return QRect(xoffset, yoffset, displaywidth, displayheight);
    31083111}
    31093112
    3110 #define OSD_STRDUP(X) strdup(gContext->GetSetting(X).toLocal8Bit().constData())
     3113#define OSD_STRDUP(X) strdup(settings->GetSetting(X, "").toLocal8Bit().constData())
    31113114
    3112 static void initialize_osd_fonts(void)
     3115static void initialize_osd_fonts(PlaySettings *settings)
    31133116{
    31143117    QMutexLocker locker(&cc708_init_lock);
    31153118    if (cc708_defaults_initialized)
    31163119        return;
    31173120    cc708_defaults_initialized = true;
    31183121
    3119     QString default_font_type = gContext->GetSetting(
     3122    QString default_font_type = settings->GetSetting(
    31203123        "OSDCC708DefaultFontType", "MonoSerif");
    31213124
    31223125    // 0
  • libs/libmythtv/videoout_quartz.h

     
    33
    44class DVDV;
    55struct QuartzData;
     6class PlaySettings;
    67
    78#include "videooutbase.h"
    89
     
    1011{
    1112  public:
    1213    static void GetRenderOptions(render_opts &opts, QStringList &cpudeints);
    13     VideoOutputQuartz(MythCodecID av_codec_id, void *codec_priv);
     14    VideoOutputQuartz(PlaySettings *settings, MythCodecID av_codec_id, void *codec_priv);
    1415   ~VideoOutputQuartz();
    1516
    1617    bool Init(int width, int height, float aspect, WId winid,
     
    5152    static MythCodecID GetBestSupportedCodec(
    5253        uint width, uint height,
    5354        uint osd_width, uint osd_height,
    54         uint stream_type, uint fourcc);
     55        uint stream_type, uint fourcc, PlaySettings *settings);
    5556    virtual bool NeedExtraAudioDecode(void) const
    5657        { return !codec_is_std(myth_codec_id); }
    5758
  • 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{
     
    211212pref_map_t  VideoDisplayProfile::dec_name;
    212213safe_list_t VideoDisplayProfile::safe_decoders;
    213214
    214 VideoDisplayProfile::VideoDisplayProfile()
     215VideoDisplayProfile::VideoDisplayProfile(PlaySettings *settings)
    215216    : lock(QMutex::Recursive), last_size(0,0), last_rate(0.0f),
    216217      last_video_renderer(QString::null)
    217218{
     
    219220    init_statics();
    220221
    221222    QString hostname    = gContext->GetHostName();
    222     QString cur_profile = GetDefaultProfileName(hostname);
     223    QString cur_profile = GetDefaultProfileName(hostname, settings);
    223224    uint    groupid     = GetProfileGroupID(cur_profile, hostname);
    224225
    225226    item_list_t items = LoadDB(groupid);
     
    771772    return list;
    772773}
    773774
    774 QString VideoDisplayProfile::GetDefaultProfileName(const QString &hostname)
     775QString VideoDisplayProfile::GetDefaultProfileName(const QString &hostname, PlaySettings *settings)
    775776{
    776     QString tmp =
     777    QString tmp = settings ? settings->GetSetting("DefaultVideoPlaybackProfile", "") :
    777778        gContext->GetSettingOnHost("DefaultVideoPlaybackProfile", hostname);
    778779
    779780    QStringList profiles = GetProfiles(hostname);
  • libs/libmythtv/udpnotify.h

     
    2020class QByteArray;
    2121class QUdpSocket;
    2222class QDomElement;
     23class PlaySettings;
    2324
    2425class UDPNotifyOSDSet
    2526{
     
    5455    Q_OBJECT
    5556
    5657  public:
    57     UDPNotify(uint udp_port);
     58    UDPNotify(uint udp_port, PlaySettings *settings);
    5859
    5960  signals:
    6061    void AddUDPNotifyEvent(const QString &name, const UDPNotifyOSDSet*);
  • 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(); ++iterValues, ++iterLabels)
     243    {
     244        if (*iterValues == value)
     245            return *iterLabels;
     246    }
     247
     248    return "???";
     249}
     250
    238251bool SelectSetting::ReplaceLabel(const QString &new_label, const QString &value)
    239252{
    240253    int i = getValueIndex(value);
     
    878891
    879892QWidget* CheckBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
    880893                                       const char* widgetName) {
    881     widget = new MythCheckBox(parent, widgetName);
     894    widget = new MythCheckBox(parent, widgetName, isTristate);
    882895    connect(widget, SIGNAL(destroyed(QObject*)),
    883896            this,   SLOT(widgetDeleted(QObject*)));
    884897
    885898    widget->setHelpText(getHelpText());
    886899    widget->setText(getLabel());
    887     widget->setChecked(boolValue());
     900    widget->setCheckState(tristateValue());
     901    setValue(tristateValue());
    888902
    889     connect(widget, SIGNAL(toggled(bool)),
    890             this, SLOT(setValue(bool)));
    891     connect(this, SIGNAL(valueChanged(bool)),
    892             widget, SLOT(setChecked(bool)));
     903    connect(widget, SIGNAL(stateChanged(int)),
     904            this, SLOT(setValue(int)));
     905    connect(this, SIGNAL(valueChanged(int)),
     906            this, SLOT(relayValueChanged(int)));
    893907
    894908    if (cg)
    895909        connect(widget, SIGNAL(changeHelpText(QString)), cg,
     
    905919
    906920void CheckBoxSetting::setEnabled(bool fEnabled)
    907921{
    908     BooleanSetting::setEnabled(fEnabled);
     922    TristateSetting::setEnabled(fEnabled);
    909923    if (widget)
    910924        widget->setEnabled(fEnabled);
    911925}
     
    914928{
    915929    if (widget)
    916930        widget->setHelpText(str);
    917     BooleanSetting::setHelpText(str);
     931    TristateSetting::setHelpText(str);
    918932}
    919933
     934const char *TristateSetting::kPartiallyCheckedString = "default";
     935
     936void CheckBoxSetting::setValue(int check)
     937{
     938    if (widget)
     939    {
     940        QFont f = widget->font();
     941        if (check == Qt::Checked)
     942            f.setWeight(QFont::Bold);
     943        else if (check == Qt::Unchecked)
     944            f.setWeight(QFont::Bold);
     945        else
     946            f.setWeight(QFont::Light);
     947        widget->setFont(f);
     948    }
     949    TristateSetting::setValue(check);
     950    emit valueChanged(check);
     951}
     952
     953void TristateSetting::setValue(int check)
     954{
     955    if (check == Qt::Checked)
     956        Setting::setValue("1");
     957    else if (check == Qt::Unchecked)
     958        Setting::setValue("0");
     959    else
     960        Setting::setValue(kPartiallyCheckedString);
     961    emit valueChanged(check);
     962}
     963
    920964void AutoIncrementDBSetting::Save(QString table)
    921965{
    922966    if (intValue() == 0)
  • libs/libmyth/settings.h

     
    290290
    291291    virtual QString getSelectionLabel(void) const;
    292292    virtual int getValueIndex(QString value);
     293    virtual QString getValueLabel(const QString &value);
    293294
    294295protected:
    295296    virtual bool ReplaceLabel(
     
    463464    void valueChanged(bool);
    464465};
    465466
    466 class MPUBLIC CheckBoxSetting: public BooleanSetting {
     467class MPUBLIC TristateSetting : public Setting
     468{
     469    Q_OBJECT
     470
     471  public:
     472    TristateSetting(Storage *_storage) : Setting(_storage) {}
     473
     474    Qt::CheckState tristateValue(void) const {
     475        if (getValue() == "0")
     476            return Qt::Unchecked;
     477        if (getValue() == "1")
     478            return Qt::Checked;
     479        return Qt::PartiallyChecked;
     480    };
     481
     482    bool boolValue(void) const {
     483        return getValue().toInt() != 0;
     484    };
     485
     486    static const char *kPartiallyCheckedString;
     487
     488public slots:
     489    virtual void setValue(/*Qt::CheckState*/int check);
     490
     491signals:
     492    void valueChanged(int);
     493};
     494
     495class MPUBLIC CheckBoxSetting: public TristateSetting {
     496    Q_OBJECT
     497
    467498public:
    468     CheckBoxSetting(Storage *_storage) :
    469         BooleanSetting(_storage), widget(NULL) { }
     499    CheckBoxSetting(Storage *_storage, bool _isTristate=false) :
     500        TristateSetting(_storage), widget(NULL), isTristate(_isTristate) { }
    470501    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
    471502                                  const char* widgetName = 0);
    472503    virtual void widgetInvalid(QObject*);
     
    475506
    476507    virtual void setHelpText(const QString &str);
    477508
     509
     510public slots:
     511    virtual void setValue(/*Qt::CheckState*/int check);
     512    virtual void relayValueChanged(int state) {
     513        if (widget)
     514            widget->setCheckState((Qt::CheckState)state);
     515    }
     516
    478517protected:
    479518    MythCheckBox *widget;
     519    bool isTristate;
    480520};
    481521
    482522class MPUBLIC PathSetting : public ComboBoxSetting
  • libs/libmyth/mythwidgets.cpp

     
    223223        else if (action == "DOWN")
    224224            focusNextPrevChild(true);
    225225        else if (action == "LEFT" || action == "RIGHT" || action == "SELECT")
    226             toggle();
     226        {
     227            if (isTristate())
     228            {
     229                Qt::CheckState newState = (Qt::CheckState)(((int)checkState() + 1) % 3);
     230                setCheckState(newState);
     231            }
     232            else
     233                toggle();
     234        }
    227235        else
    228236            handled = false;
    229237    }
  • 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", bool isTristate = false)
     333        : QCheckBox(parent)       { setObjectName(name); setTristate(isTristate); };
    334334    MythCheckBox(const QString &text,
    335                  QWidget *parent = 0, const char *name = "MythCheckBox")
    336         : QCheckBox(text, parent) { setObjectName(name); };
     335                 QWidget *parent = 0, const char *name = "MythCheckBox", bool isTristate = false)
     336        : QCheckBox(text, parent) { setObjectName(name); setTristate(isTristate); };
    337337
    338338    void setHelpText(const QString&);
    339339
  • 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    CheckBoxSetting *var; \
     44    if ((settings))                                       \
     45        var = new PlaySettingsCheckBox((name), (settings), true);    \
     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_SPINBOX_SETTING(var, name, settings, arg1, arg2, arg3, arg4) \
     57    SpinBoxSetting *var; \
     58    if ((settings))                                                     \
     59        var = new PlaySettingsSpinBox((name), (settings), (arg1), (arg2), (arg3), (arg4)); \
     60    else \
     61        var = new HostSpinBox((name), (arg1), (arg2), (arg3), (arg4))
     62
     63#define CREATE_LINEEDIT_SETTING(var, name, settings) \
     64    LineEditSetting *var; \
     65    if ((settings))                                       \
     66        var = new PlaySettingsLineEdit((name), (settings), ""); \
     67    else \
     68        var = new HostLineEdit((name))
     69
     70static Configurable *wrap(Configurable *obj, PlaySettings *settings,
     71                          bool twoLineLabel=false)
     72{
     73    if (!settings)
     74        return obj;
     75
     76    // Get the setting name
     77    PlaySettingsCombinedStorage *storage =
     78        dynamic_cast<PlaySettingsCombinedStorage *>(obj);
     79    const QString &name = storage->getName();
     80
     81    // Get the default label, which may be different depending on the
     82    // object type
     83    QString defaultLabel = settings->GetSetting(name, "", true);
     84    if (dynamic_cast<CheckBoxSetting *>(obj))
     85        defaultLabel = (defaultLabel == "0" || defaultLabel == "" ?
     86                        QObject::tr("disabled") : QObject::tr("enabled"));
     87    if (dynamic_cast<SpinBoxSetting *>(obj) && defaultLabel == "")
     88        defaultLabel = "0";
     89    ComboBoxSetting *cb = dynamic_cast<ComboBoxSetting *>(obj);
     90    if (cb)
     91    {
     92        defaultLabel = cb->getValueLabel(defaultLabel);
     93        // Add the default selection to a ComboBox
     94        cb->addSelection(QString("(") + QObject::tr("default") + ")",
     95                         storage->getDefault(), !settings->IsOverridden(name));
     96    }
     97   
     98    // Change the help text to include the default.
     99    if (dynamic_cast<LineEditSetting *>(obj))
     100        obj->setHelpText(QObject::tr("Leave blank to keep default value")
     101                         + " (" + defaultLabel + "). " + obj->getHelpText());
     102    else
     103        obj->setHelpText(QObject::tr("Override default value")
     104                         + " (" + defaultLabel + "). " + obj->getHelpText());
     105
     106    // Change the label to include the default.
     107    obj->setLabel(obj->getLabel() + (twoLineLabel ? "\n" : "") +
     108                  " (" + defaultLabel + ")");
     109
     110    return obj;
     111}
     112
    41113static HostComboBox *AudioOutputDevice()
    42114{
    43115    HostComboBox *gc = new HostComboBox("AudioOutputDevice", true);
     
    309381    return gc;
    310382}
    311383
    312 static HostCheckBox *DecodeExtraAudio()
     384static Configurable *DecodeExtraAudio(PlaySettings *settings)
    313385{
    314     HostCheckBox *gc = new HostCheckBox("DecodeExtraAudio");
     386    CREATE_CHECKBOX_SETTING(gc, "DecodeExtraAudio", settings);
    315387    gc->setLabel(QObject::tr("Extra audio buffering"));
    316388    gc->setValue(true);
    317389    gc->setHelpText(QObject::tr("Enable this setting if MythTV is playing "
     
    320392                    "effect on framegrabbers (MPEG-4/RTJPEG).  MythTV will "
    321393                    "keep extra audio data in its internal buffers to workaround "
    322394                    "this bug."));
    323     return gc;
     395    return wrap(gc, settings);
    324396}
    325397
    326 static HostComboBox *PIPLocationComboBox()
     398static Configurable *PIPLocationComboBox(PlaySettings *settings)
    327399{
    328     HostComboBox *gc = new HostComboBox("PIPLocation");
     400    CREATE_COMBOBOX_SETTING(gc, "PIPLocation", settings);
    329401    gc->setLabel(QObject::tr("PIP Video Location"));
    330402    for (uint loc = 0; loc < kPIP_END; ++loc)
    331403        gc->addSelection(toString((PIPLocation) loc), QString::number(loc));
    332404    gc->setHelpText(QObject::tr("Location of PIP Video window."));
    333     return gc;
     405    return wrap(gc, settings);
    334406}
    335407
    336408static GlobalLineEdit *AllRecGroupPassword()
     
    427499    return gc;
    428500}
    429501
    430 static HostCheckBox *SmartForward()
     502static Configurable *SmartForward(PlaySettings *settings)
    431503{
    432     HostCheckBox *gc = new HostCheckBox("SmartForward");
     504    CREATE_CHECKBOX_SETTING(gc, "SmartForward", settings);
    433505    gc->setLabel(QObject::tr("Smart Fast Forwarding"));
    434506    gc->setValue(false);
    435507    gc->setHelpText(QObject::tr("If enabled, then immediately after "
    436508                    "rewinding, only skip forward the same amount as "
    437509                    "skipping backwards."));
    438     return gc;
     510    return wrap(gc, settings);
    439511}
    440512
    441 static HostCheckBox *ExactSeeking()
     513static Configurable *ExactSeeking(PlaySettings *settings)
    442514{
    443     HostCheckBox *gc = new HostCheckBox("ExactSeeking");
     515    CREATE_CHECKBOX_SETTING(gc, "ExactSeeking", settings);
    444516    gc->setLabel(QObject::tr("Seek to exact frame"));
    445517    gc->setValue(false);
    446518    gc->setHelpText(QObject::tr("If enabled, seeking is frame exact, but "
    447519                    "slower."));
    448     return gc;
     520    return wrap(gc, settings);
    449521}
    450522
    451523static GlobalComboBox *CommercialSkipMethod()
     
    463535    return bc;
    464536}
    465537
    466 static HostComboBox *AutoCommercialSkip()
     538static Configurable *AutoCommercialSkip(PlaySettings *settings)
    467539{
    468     HostComboBox *gc = new HostComboBox("AutoCommercialSkip");
     540    CREATE_COMBOBOX_SETTING(gc, "AutoCommercialSkip", settings);
    469541    gc->setLabel(QObject::tr("Automatically Skip Commercials"));
    470542    gc->addSelection(QObject::tr("Off"), "0");
    471543    gc->addSelection(QObject::tr("Notify, but do not skip"), "2");
     
    474546                    "have been flagged during Automatic Commercial Flagging "
    475547                    "or by the mythcommflag program, or just notify that a "
    476548                    "commercial has been detected."));
    477     return gc;
     549    return wrap(gc, settings);
    478550}
    479551
    480552static GlobalCheckBox *AutoCommercialFlag()
     
    559631    return bc;
    560632}
    561633
    562 static HostSpinBox *CommRewindAmount()
     634static Configurable *CommRewindAmount(PlaySettings *settings)
    563635{
    564     HostSpinBox *gs = new HostSpinBox("CommRewindAmount", 0, 10, 1);
     636    CREATE_SPINBOX_SETTING(gs, "CommRewindAmount", settings, 0, 10, 1, false);
    565637    gs->setLabel(QObject::tr("Commercial Skip Auto-Rewind Amount"));
    566638    gs->setHelpText(QObject::tr("If set, MythTV will automatically rewind "
    567639                    "this many seconds after performing a commercial skip."));
    568640    gs->setValue(0);
    569     return gs;
     641    return wrap(gs, settings);
    570642}
    571643
    572 static HostSpinBox *CommNotifyAmount()
     644static Configurable *CommNotifyAmount(PlaySettings *settings)
    573645{
    574     HostSpinBox *gs = new HostSpinBox("CommNotifyAmount", 0, 10, 1);
     646    CREATE_SPINBOX_SETTING(gs, "CommNotifyAmount", settings, 0, 10, 1, false);
    575647    gs->setLabel(QObject::tr("Commercial Skip Notify Amount"));
    576648    gs->setHelpText(QObject::tr("If set, MythTV will act like a commercial "
    577649                    "begins this many seconds early.  This can be useful "
    578650                    "when commercial notification is used in place of "
    579651                    "automatic skipping."));
    580652    gs->setValue(0);
    581     return gs;
     653    return wrap(gs, settings);
    582654}
    583655
    584656static GlobalSpinBox *MaximumCommercialSkip()
     
    13681440    labels[j]->setValue(label_i);
    13691441}
    13701442
    1371 PlaybackProfileConfigs::PlaybackProfileConfigs(const QString &str) :
     1443PlaybackProfileConfigs::PlaybackProfileConfigs(const QString &str, PlaySettings *settings) :
    13721444    TriggeredConfigurationGroup(false, true,  true, true,
    13731445                                false, false, true, true), grouptrigger(NULL)
    13741446{
    13751447    setLabel(QObject::tr("Playback Profiles") + str);
     1448    if (settings)
     1449        setLabel(QObject::tr("Playback group settings for ") +
     1450                 settings->mGroupName + " - " +
     1451                 getLabel());
    13761452
    13771453    QString host = gContext->GetHostName();
    13781454    QStringList profiles = VideoDisplayProfile::GetProfiles(host);
     
    14001476        profiles = VideoDisplayProfile::GetProfiles(host);
    14011477    }
    14021478
    1403     QString profile = VideoDisplayProfile::GetDefaultProfileName(host);
     1479    QString profile = VideoDisplayProfile::GetDefaultProfileName(host, settings);
    14041480    if (!profiles.contains(profile))
    14051481    {
    14061482        profile = (profiles.contains("Normal")) ? "Normal" : profiles[0];
    14071483        VideoDisplayProfile::SetDefaultProfileName(profile, host);
    14081484    }
    14091485
    1410     grouptrigger = new HostComboBox("DefaultVideoPlaybackProfile");
     1486    CREATE_COMBOBOX_SETTING(gs, "DefaultVideoPlaybackProfile", settings);
     1487    grouptrigger = gs;
    14111488    grouptrigger->setLabel(QObject::tr("Current Video Playback Profile"));
    14121489    QStringList::const_iterator it;
    14131490    for (it = profiles.begin(); it != profiles.end(); ++it)
    14141491        grouptrigger->addSelection(ProgramInfo::i18n(*it), *it);
     1492    if (settings)
     1493    {
     1494        addChild(wrap(grouptrigger, settings));
     1495        return;
     1496    }
    14151497
    14161498    HorizontalConfigurationGroup *grp =
    14171499        new HorizontalConfigurationGroup(false, false, true, true);
     
    15441626    return gc;
    15451627}
    15461628
    1547 static HostSpinBox *FFRewReposTime()
     1629static Configurable *FFRewReposTime(PlaySettings *settings)
    15481630{
    1549     HostSpinBox *gs = new HostSpinBox("FFRewReposTime", 0, 200, 5);
     1631    CREATE_SPINBOX_SETTING(gs, "FFRewReposTime", settings, 0, 200, 5, false);
    15501632    gs->setLabel(QObject::tr("Fast forward/rewind reposition amount"));
    15511633    gs->setValue(100);
    15521634    gs->setHelpText(QObject::tr("When exiting sticky keys fast forward/rewind "
     
    15541636                    "resuming normal playback. This "
    15551637                    "compensates for the reaction time between seeing "
    15561638                    "where to resume playback and actually exiting seeking."));
    1557     return gs;
     1639    return wrap(gs, settings);
    15581640}
    15591641
    1560 static HostCheckBox *FFRewReverse()
     1642static Configurable *FFRewReverse(PlaySettings *settings)
    15611643{
    1562     HostCheckBox *gc = new HostCheckBox("FFRewReverse");
     1644    CREATE_CHECKBOX_SETTING(gc, "FFRewReverse", settings);
    15631645    gc->setLabel(QObject::tr("Reverse direction in fast forward/rewind"));
    15641646    gc->setValue(true);
    15651647    gc->setHelpText(QObject::tr("If enabled, pressing the sticky rewind key "
     
    15671649                    "vice versa.  If disabled, it will decrease the "
    15681650                    "current speed or switch to play mode if "
    15691651                    "the speed can't be decreased further."));
    1570     return gc;
     1652    return wrap(gc, settings);
    15711653}
    15721654
    1573 static HostSpinBox *OSDGeneralTimeout()
     1655static Configurable *OSDGeneralTimeout(PlaySettings *settings)
    15741656{
    1575     HostSpinBox *gs = new HostSpinBox("OSDGeneralTimeout", 1, 30, 1);
     1657    CREATE_SPINBOX_SETTING(gs, "OSDGeneralTimeout", settings, 1, 30, 1, false);
    15761658    gs->setLabel(QObject::tr("General OSD time-out (sec)"));
    15771659    gs->setValue(2);
    15781660    gs->setHelpText(QObject::tr("Length of time an on-screen display "
    15791661                    "window will be visible."));
    1580     return gs;
     1662    return wrap(gs, settings);
    15811663}
    15821664
    1583 static HostSpinBox *OSDProgramInfoTimeout()
     1665static Configurable *OSDProgramInfoTimeout(PlaySettings *settings)
    15841666{
    1585     HostSpinBox *gs = new HostSpinBox("OSDProgramInfoTimeout", 1, 30, 1);
     1667    CREATE_SPINBOX_SETTING(gs, "OSDProgramInfoTimeout", settings, 1, 30, 1, false);
    15861668    gs->setLabel(QObject::tr("Program Info OSD time-out"));
    15871669    gs->setValue(3);
    15881670    gs->setHelpText(QObject::tr("Length of time the on-screen display "
    15891671                    "will display program information."));
    1590     return gs;
     1672    return wrap(gs, settings);
    15911673}
    15921674
    1593 static HostSpinBox *OSDNotifyTimeout()
     1675static Configurable *OSDNotifyTimeout(PlaySettings *settings)
    15941676{
    1595     HostSpinBox *gs = new HostSpinBox("OSDNotifyTimeout", 1, 30, 1);
     1677    CREATE_SPINBOX_SETTING(gs, "OSDNotifyTimeout", settings, 1, 30, 1, false);
    15961678    gs->setLabel(QObject::tr("UDP Notify OSD time-out"));
    15971679    gs->setValue(5);
    15981680    gs->setHelpText(QObject::tr("How many seconds an on-screen display "
    15991681                    "will be active for UDP Notify events."));
    1600     return gs;
     1682    return wrap(gs, settings);
    16011683}
    16021684
    16031685static HostSpinBox *ThemeCacheSize()
     
    16411723    return gc;
    16421724}
    16431725
    1644 static HostComboBox *OSDFont()
     1726static Configurable *OSDFont(PlaySettings *settings)
    16451727{
    1646     HostComboBox *gc = new HostComboBox("OSDFont");
     1728    CREATE_COMBOBOX_SETTING(gc, "OSDFont", settings);
    16471729    gc->setLabel(QObject::tr("OSD font"));
    16481730    QDir ttf(GetFontsDir(), GetFontsNameFilter());
    16491731    gc->fillSelectionsFromDir(ttf, false);
     
    16511733    if (gc->findSelection(defaultOSDFont) > -1)
    16521734        gc->setValue(defaultOSDFont);
    16531735
    1654     return gc;
     1736    return wrap(gc, settings);
    16551737}
    16561738
    1657 static HostComboBox *OSDCCFont()
     1739static Configurable *OSDCCFont(PlaySettings *settings)
    16581740{
    1659     HostComboBox *gc = new HostComboBox("OSDCCFont");
     1741    CREATE_COMBOBOX_SETTING(gc, "OSDCCFont", settings);
    16601742    gc->setLabel(QObject::tr("CC font"));
    16611743    QDir ttf(GetFontsDir(), GetFontsNameFilter());
    16621744    gc->fillSelectionsFromDir(ttf, false);
    16631745    gc->setHelpText(QObject::tr("Closed Caption font"));
    16641746
    1665     return gc;
     1747    return wrap(gc, settings);
    16661748}
    16671749
    16681750static HostComboBox __attribute__ ((unused)) *DecodeVBIFormat()
     
    16831765    return gc;
    16841766}
    16851767
    1686 static HostSpinBox *OSDCC708TextZoomPercentage(void)
     1768static Configurable *OSDCC708TextZoomPercentage(PlaySettings *settings)
    16871769{
    1688     HostSpinBox *gs = new HostSpinBox("OSDCC708TextZoom", 50, 200, 5);
     1770    CREATE_SPINBOX_SETTING(gs, "OSDCC708TextZoom", settings, 50, 200, 5, false);
    16891771    gs->setLabel(QObject::tr("Text zoom percentage"));
    16901772    gs->setValue(100);
    16911773    gs->setHelpText(QObject::tr("Use this to enlarge or shrink captions."));
    16921774
    1693     return gs;
     1775    return wrap(gs, settings);
    16941776}
    16951777
    1696 static HostComboBox *OSDCC708DefaultFontType(void)
     1778static Configurable *OSDCC708DefaultFontType(PlaySettings *settings)
    16971779{
    1698     HostComboBox *hc = new HostComboBox("OSDCC708DefaultFontType");
     1780    CREATE_COMBOBOX_SETTING(hc, "OSDCC708DefaultFontType", settings);
    16991781    hc->setLabel(QObject::tr("Default Caption Font Type"));
    17001782    hc->setHelpText(
    17011783        QObject::tr("This allows you to set which font type to use "
     
    17181800    };
    17191801    for (uint i = 0; i < 7; ++i)
    17201802        hc->addSelection(typeNames[i], types[i]);
    1721     return hc;
     1803    return wrap(hc, settings);
    17221804}
    17231805
    1724 static VerticalConfigurationGroup *OSDCC708Settings(void)
     1806static VerticalConfigurationGroup *OSDCC708Settings(PlaySettings *settings)
    17251807{
    17261808    VerticalConfigurationGroup *grp =
    17271809        new VerticalConfigurationGroup(false, true, true, true);
    17281810    grp->setLabel(QObject::tr("ATSC Caption Settings"));
     1811    if (settings)
     1812        grp->setLabel(QObject::tr("Playback group settings for ") +
     1813                      settings->mGroupName + " - " +
     1814                      grp->getLabel());
    17291815
    17301816// default text zoom 1.0
    1731     grp->addChild(OSDCC708TextZoomPercentage());
     1817    grp->addChild(OSDCC708TextZoomPercentage(settings));
    17321818
    17331819// force X lines of captions
    17341820// force caption character color
     
    17371823// force background opacity
    17381824
    17391825// set default font type
    1740     grp->addChild(OSDCC708DefaultFontType());
     1826    grp->addChild(OSDCC708DefaultFontType(settings));
    17411827
    17421828    return grp;
    17431829}
    17441830
    1745 static HostComboBox *OSDCC708Font(
     1831static Configurable *OSDCC708Font(
    17461832    const QString &subtype, const QString &subtypeName,
    1747     const QString &subtypeNameForHelp)
     1833    const QString &subtypeNameForHelp, PlaySettings *settings)
    17481834{
    1749     HostComboBox *gc = new HostComboBox(
    1750         QString("OSDCC708%1Font").arg(subtype));
     1835    CREATE_COMBOBOX_SETTING(gc, QString("OSDCC708%1Font").arg(subtype), settings);
    17511836
    17521837    gc->setLabel(subtypeName);
    17531838    QDir ttf(GetFontsDir(), GetFontsNameFilter());
     
    17551840    gc->setHelpText(
    17561841        QObject::tr("ATSC %1 closed caption font.").arg(subtypeNameForHelp));
    17571842
    1758     return gc;
     1843    return wrap(gc, settings, (subtypeName.length() > 10));
    17591844}
    17601845
    1761 static HorizontalConfigurationGroup *OSDCC708Fonts(void)
     1846static HorizontalConfigurationGroup *OSDCC708Fonts(PlaySettings *settings)
    17621847{
    17631848    HorizontalConfigurationGroup *grpmain =
    17641849        new HorizontalConfigurationGroup(false, true, true, true);
    17651850    grpmain->setLabel(QObject::tr("ATSC Caption Fonts"));
     1851    if (settings)
     1852        grpmain->setLabel(QObject::tr("Playback group settings for ") +
     1853                          settings->mGroupName + " - " +
     1854                          grpmain->getLabel());
    17661855    VerticalConfigurationGroup *col[] =
    17671856    {
    17681857        new VerticalConfigurationGroup(false, false, true, true),
     
    17981887    for (uint j = 0; j < 7; ++j)
    17991888    {
    18001889        col[i]->addChild(OSDCC708Font(subtypes[i].arg(types[j]),
    1801                                       typeNames[j], typeNames[j]));
     1890                                      typeNames[j], typeNames[j],
     1891                                      settings));
    18021892    }
    18031893    grpmain->addChild(col[i]);
    18041894
     
    18061896    for (uint j = 0; j < 7; ++j)
    18071897    {
    18081898        col[i]->addChild(OSDCC708Font(
    1809                              subtypes[i].arg(types[j]), "",
    1810                              QObject::tr("Italic") + ' ' + typeNames[j]));
     1899                                      subtypes[i].arg(types[j]), (settings ? typeNames[j] : ""),
     1900                             QObject::tr("Italic") + ' ' + typeNames[j],
     1901                                      settings));
    18111902    }
    18121903
    18131904    grpmain->addChild(col[i]);
     
    18151906    return grpmain;
    18161907}
    18171908
    1818 static HostComboBox *SubtitleCodec()
     1909static Configurable *SubtitleCodec(PlaySettings *settings)
    18191910{
    1820     HostComboBox *gc = new HostComboBox("SubtitleCodec");
     1911    CREATE_COMBOBOX_SETTING(gc, "SubtitleCodec", settings);
    18211912
    18221913    gc->setLabel(QObject::tr("Subtitle Codec"));
    18231914    QList<QByteArray> list = QTextCodec::availableCodecs();
     
    18271918        gc->addSelection(val, val, val.toLower() == "utf-8");
    18281919    }
    18291920
    1830     return gc;
     1921    return wrap(gc, settings);
    18311922}
    18321923
    1833 static HorizontalConfigurationGroup *ExternalSubtitleSettings()
     1924static HorizontalConfigurationGroup *ExternalSubtitleSettings(PlaySettings *settings)
    18341925{
    18351926    HorizontalConfigurationGroup *grpmain =
    18361927        new HorizontalConfigurationGroup(false, true, true, true);
    18371928
    18381929    grpmain->setLabel(QObject::tr("External Subtitle Settings"));
    18391930
    1840     grpmain->addChild(SubtitleCodec());
     1931    grpmain->addChild(SubtitleCodec(settings));
    18411932
    18421933    return grpmain;
    18431934}
    18441935
    1845 static HostComboBox *OSDThemeFontSizeType()
     1936static Configurable *OSDThemeFontSizeType(PlaySettings *settings)
    18461937{
    1847     HostComboBox *gc = new HostComboBox("OSDThemeFontSizeType");
     1938    CREATE_COMBOBOX_SETTING(gc, "OSDThemeFontSizeType", settings);
    18481939    gc->setLabel(QObject::tr("Font size"));
    18491940    gc->addSelection(QObject::tr("default"), "default");
    18501941    gc->addSelection(QObject::tr("small"), "small");
    18511942    gc->addSelection(QObject::tr("big"), "big");
    18521943    gc->setHelpText(QObject::tr("default: TV, small: monitor, big:"));
    1853     return gc;
     1944    return wrap(gc, settings);
    18541945}
    18551946
    18561947static HostComboBox *ChannelOrdering()
     
    18621953    return gc;
    18631954}
    18641955
    1865 static HostSpinBox *VertScanPercentage()
     1956static Configurable *VertScanPercentage(PlaySettings *settings)
    18661957{
    1867     HostSpinBox *gs = new HostSpinBox("VertScanPercentage", -100, 100, 1);
     1958    CREATE_SPINBOX_SETTING(gs, "VertScanPercentage", settings, -100, 100, 1, false);
    18681959    gs->setLabel(QObject::tr("Vertical scaling"));
    18691960    gs->setValue(0);
    18701961    gs->setHelpText(QObject::tr(
    18711962                        "Adjust this if the image does not fill your "
    18721963                        "screen vertically. Range -100% to 100%"));
    1873     return gs;
     1964    return wrap(gs, settings);
    18741965}
    18751966
    1876 static HostSpinBox *HorizScanPercentage()
     1967static Configurable *HorizScanPercentage(PlaySettings *settings)
    18771968{
    1878     HostSpinBox *gs = new HostSpinBox("HorizScanPercentage", -100, 100, 1);
     1969    CREATE_SPINBOX_SETTING(gs, "HorizScanPercentage", settings, -100, 100, 1, false);
    18791970    gs->setLabel(QObject::tr("Horizontal scaling"));
    18801971    gs->setValue(0);
    18811972    gs->setHelpText(QObject::tr(
    18821973                        "Adjust this if the image does not fill your "
    18831974                        "screen horizontally. Range -100% to 100%"));
    1884     return gs;
     1975    return wrap(gs, settings);
    18851976};
    18861977
    1887 static HostSpinBox *XScanDisplacement()
     1978static Configurable *XScanDisplacement(PlaySettings *settings)
    18881979{
    1889     HostSpinBox *gs = new HostSpinBox("XScanDisplacement", -50, 50, 1);
     1980    CREATE_SPINBOX_SETTING(gs, "XScanDisplacement", settings, -50, 50, 1, false);
    18901981    gs->setLabel(QObject::tr("Scan displacement (X)"));
    18911982    gs->setValue(0);
    18921983    gs->setHelpText(QObject::tr("Adjust this to move the image horizontally."));
    1893     return gs;
     1984    return wrap(gs, settings);
    18941985}
    18951986
    1896 static HostSpinBox *YScanDisplacement()
     1987static Configurable *YScanDisplacement(PlaySettings *settings)
    18971988{
    1898     HostSpinBox *gs = new HostSpinBox("YScanDisplacement", -50, 50, 1);
     1989    CREATE_SPINBOX_SETTING(gs, "YScanDisplacement", settings, -50, 50, 1, false);
    18991990    gs->setLabel(QObject::tr("Scan displacement (Y)"));
    19001991    gs->setValue(0);
    19011992    gs->setHelpText(QObject::tr("Adjust this to move the image vertically."));
    1902     return gs;
     1993    return wrap(gs, settings);
    19031994};
    19041995
    19051996static HostCheckBox *AlwaysStreamFiles()
     
    19152006    return gc;
    19162007}
    19172008
    1918 static HostCheckBox *UseVideoTimebase()
     2009static Configurable *UseVideoTimebase(PlaySettings *settings)
    19192010{
    1920     HostCheckBox *gc = new HostCheckBox("UseVideoTimebase");
     2011    CREATE_CHECKBOX_SETTING(gc, "UseVideoTimebase", settings);
    19212012    gc->setLabel(QObject::tr("Use video as timebase"));
    19222013    gc->setValue(false);
    19232014    gc->setHelpText(QObject::tr("Use the video as the timebase and warp "
    19242015                    "the audio to keep it in sync. (Experimental)"));
    1925     return gc;
     2016    return wrap(gc, settings);
    19262017}
    19272018
    1928 static HostCheckBox *CCBackground()
     2019static Configurable *CCBackground(PlaySettings *settings)
    19292020{
    1930     HostCheckBox *gc = new HostCheckBox("CCBackground");
     2021    CREATE_CHECKBOX_SETTING(gc, "CCBackground", settings);
    19312022    gc->setLabel(QObject::tr("Black background for closed captioning"));
    19322023    gc->setValue(false);
    19332024    gc->setHelpText(QObject::tr(
    19342025                        "If enabled, captions will be displayed "
    19352026                        "as white text over a black background "
    19362027                        "for better contrast."));
    1937     return gc;
     2028    return wrap(gc, settings);
    19382029}
    19392030
    1940 static HostCheckBox *DefaultCCMode()
     2031static Configurable *DefaultCCMode(PlaySettings *settings)
    19412032{
    1942     HostCheckBox *gc = new HostCheckBox("DefaultCCMode");
     2033    CREATE_CHECKBOX_SETTING(gc, "DefaultCCMode", settings);
    19432034    gc->setLabel(QObject::tr("Always display closed captioning or subtitles"));
    19442035    gc->setValue(false);
    19452036    gc->setHelpText(QObject::tr(
     
    19472038                        "when playing back recordings or watching "
    19482039                        "live TV.  Closed Captioning can be turned on or off "
    19492040                        "by pressing \"T\" during playback."));
    1950     return gc;
     2041    return wrap(gc, settings);
    19512042}
    19522043
    1953 static HostCheckBox *PreferCC708()
     2044static Configurable *PreferCC708(PlaySettings *settings)
    19542045{
    1955     HostCheckBox *gc = new HostCheckBox("Prefer708Captions");
     2046    CREATE_CHECKBOX_SETTING(gc, "Prefer708Captions", settings);
    19562047    gc->setLabel(QObject::tr("Prefer EIA-708 over EIA-608 captions"));
    19572048    gc->setValue(true);
    19582049    gc->setHelpText(
     
    19602051            "When enabled the new EIA-708 captions will be preferred over "
    19612052            "the old EIA-608 captions in ATSC streams."));
    19622053
    1963     return gc;
     2054    return wrap(gc, settings);
    19642055}
    19652056
    1966 static HostCheckBox *EnableMHEG()
     2057static Configurable *EnableMHEG(PlaySettings *settings)
    19672058{
    1968     HostCheckBox *gc = new HostCheckBox("EnableMHEG");
     2059    CREATE_CHECKBOX_SETTING(gc, "EnableMHEG", settings);
    19692060    gc->setLabel(QObject::tr("Enable Interactive TV"));
    19702061    gc->setValue(false);
    19712062    gc->setHelpText(QObject::tr(
    19722063                        "If enabled, interactive TV applications (MHEG) will "
    19732064                        "be activated.  This is used for teletext and logos for "
    19742065                        "radio and channels that are currently off-air."));
    1975     return gc;
     2066    return wrap(gc, settings);
    19762067}
    19772068
    1978 static HostCheckBox *PersistentBrowseMode()
     2069static Configurable *PersistentBrowseMode(PlaySettings *settings)
    19792070{
    1980     HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
     2071    CREATE_CHECKBOX_SETTING(gc, "PersistentBrowseMode", settings);
    19812072    gc->setLabel(QObject::tr("Always use Browse mode in LiveTV"));
    19822073    gc->setValue(true);
    19832074    gc->setHelpText(
    19842075        QObject::tr(
    19852076            "If enabled, Browse mode will automatically be activated "
    19862077            "whenever you use Channel UP/DOWN while watching Live TV."));
    1987     return gc;
     2078    return wrap(gc, settings);
    19882079}
    19892080
    1990 static HostCheckBox *BrowseAllTuners()
     2081static Configurable *BrowseAllTuners(PlaySettings *settings)
    19912082{
    1992     HostCheckBox *gc = new HostCheckBox("BrowseAllTuners");
     2083    CREATE_CHECKBOX_SETTING(gc, "BrowseAllTuners", settings);
    19932084    gc->setLabel(QObject::tr("Browse all channels"));
    19942085    gc->setValue(false);
    19952086    gc->setHelpText(
     
    19972088            "If enabled, browse mode will shows channels on all "
    19982089            "available recording devices, instead of showing "
    19992090            "channels on just the current recorder."));
    2000     return gc;
     2091    return wrap(gc, settings);
    20012092}
    20022093
    2003 static HostCheckBox *ClearSavedPosition()
     2094static Configurable *ClearSavedPosition(PlaySettings *settings)
    20042095{
    2005     HostCheckBox *gc = new HostCheckBox("ClearSavedPosition");
     2096    CREATE_CHECKBOX_SETTING(gc, "ClearSavedPosition", settings);
    20062097    gc->setLabel(QObject::tr("Clear bookmark on playback"));
    20072098    gc->setValue(true);
    20082099    gc->setHelpText(QObject::tr("Automatically clear the bookmark on a "
    20092100                    "recording when the recording is played back.  If "
    20102101                    "disabled, you can mark the beginning with rewind "
    20112102                    "then save position."));
    2012     return gc;
     2103    return wrap(gc, settings);
    20132104}
    20142105
    2015 static HostCheckBox *AltClearSavedPosition()
     2106static Configurable *AltClearSavedPosition(PlaySettings *settings)
    20162107{
    2017     HostCheckBox *gc = new HostCheckBox("AltClearSavedPosition");
     2108    CREATE_CHECKBOX_SETTING(gc, "AltClearSavedPosition", settings);
    20182109    gc->setLabel(QObject::tr("Alternate clear and save bookmark"));
    20192110    gc->setValue(true);
    20202111    gc->setHelpText(QObject::tr("During playback the Select key "
     
    20222113                    "Saved\" and \"Bookmark Cleared\". If disabled, the "
    20232114                    "Select key will save the current position for each "
    20242115                    "keypress."));
    2025     return gc;
     2116    return wrap(gc, settings);
    20262117}
    20272118
    20282119#if defined(USING_XV) || defined(USING_OPENGL_VIDEO) || defined(USING_VDPAU)
    2029 static HostCheckBox *UsePicControls()
     2120static Configurable *UsePicControls(PlaySettings *settings)
    20302121{
    2031     HostCheckBox *gc = new HostCheckBox("UseOutputPictureControls");
     2122    CREATE_CHECKBOX_SETTING(gc, "UseOutputPictureControls", settings);
    20322123    gc->setLabel(QObject::tr("Enable picture controls"));
    20332124    gc->setValue(false);
    20342125    gc->setHelpText(
    20352126        QObject::tr(
    20362127            "If enabled, MythTV attempts to initialize picture controls "
    20372128            "(brightness, contrast, etc.) that are applied during playback."));
    2038     return gc;
     2129    return wrap(gc, settings);
    20392130}
    20402131#endif
    20412132
    2042 static HostLineEdit *UDPNotifyPort()
     2133static Configurable *UDPNotifyPort(PlaySettings *settings)
    20432134{
    2044     HostLineEdit *ge = new HostLineEdit("UDPNotifyPort");
     2135    CREATE_LINEEDIT_SETTING(ge, "UDPNotifyPort", settings);
    20452136    ge->setLabel(QObject::tr("UDP Notify Port"));
    20462137    ge->setValue("6948");
    20472138    ge->setHelpText(QObject::tr("During playback, MythTV will listen for "
    20482139                    "connections from the \"mythtvosd\" or \"mythudprelay\" "
    20492140                    "programs on this port.  See the README in "
    20502141                    "contrib/mythnotify/ for additional information."));
    2051     return ge;
     2142    return wrap(ge, settings);
    20522143}
    20532144
    2054 static HostComboBox *PlaybackExitPrompt()
     2145static Configurable *PlaybackExitPrompt(PlaySettings *settings)
    20552146{
    2056     HostComboBox *gc = new HostComboBox("PlaybackExitPrompt");
     2147    CREATE_COMBOBOX_SETTING(gc, "PlaybackExitPrompt", settings);
    20572148    gc->setLabel(QObject::tr("Action on playback exit"));
    20582149    gc->addSelection(QObject::tr("Just exit"), "0");
    20592150    gc->addSelection(QObject::tr("Save position and exit"), "2");
     
    20642155                    "when you exit playback mode.  The options available will "
    20652156                    "allow you to save your position, delete the "
    20662157                    "recording, or continue watching."));
    2067     return gc;
     2158    return wrap(gc, settings);
    20682159}
    20692160
    2070 static HostCheckBox *EndOfRecordingExitPrompt()
     2161static Configurable *EndOfRecordingExitPrompt(PlaySettings *settings)
    20712162{
    2072     HostCheckBox *gc = new HostCheckBox("EndOfRecordingExitPrompt");
     2163    CREATE_CHECKBOX_SETTING(gc, "EndOfRecordingExitPrompt", settings);
    20732164    gc->setLabel(QObject::tr("Prompt at end of recording"));
    20742165    gc->setValue(false);
    20752166    gc->setHelpText(QObject::tr("If set, a menu will be displayed allowing "
    20762167                    "you to delete the recording when it has finished "
    20772168                    "playing."));
    2078     return gc;
     2169    return wrap(gc, settings);
    20792170}
    20802171
    2081 static HostCheckBox *JumpToProgramOSD()
     2172static Configurable *JumpToProgramOSD(PlaySettings *settings)
    20822173{
    2083     HostCheckBox *gc = new HostCheckBox("JumpToProgramOSD");
     2174    CREATE_CHECKBOX_SETTING(gc, "JumpToProgramOSD", settings);
    20842175    gc->setLabel(QObject::tr("Jump to Program OSD"));
    20852176    gc->setValue(true);
    20862177    gc->setHelpText(QObject::tr(
     
    20892180                        "'Watch Recording' screen when 'Jump to Program' "
    20902181                        "is activated. If set, the recordings are shown "
    20912182                        "in the OSD"));
    2092     return gc;
     2183    return wrap(gc, settings);
    20932184}
    20942185
    2095 static HostCheckBox *ContinueEmbeddedTVPlay()
     2186static Configurable *ContinueEmbeddedTVPlay(PlaySettings *settings)
    20962187{
    2097     HostCheckBox *gc = new HostCheckBox("ContinueEmbeddedTVPlay");
     2188    CREATE_CHECKBOX_SETTING(gc, "ContinueEmbeddedTVPlay", settings);
    20982189    gc->setLabel(QObject::tr("Continue Playback When Embedded"));
    20992190    gc->setValue(false);
    21002191    gc->setHelpText(QObject::tr(
     
    21022193                    "is embedded in the upcoming program list or recorded "
    21032194                    "list. The default is to pause the recorded show when "
    21042195                    "embedded."));
    2105     return gc;
     2196    return wrap(gc, settings);
    21062197}
    21072198
    2108 static HostCheckBox *AutomaticSetWatched()
     2199static Configurable *AutomaticSetWatched(PlaySettings *settings)
    21092200{
    2110     HostCheckBox *gc = new HostCheckBox("AutomaticSetWatched");
     2201    CREATE_CHECKBOX_SETTING(gc, "AutomaticSetWatched", settings);
    21112202    gc->setLabel(QObject::tr("Automatically mark a recording as watched"));
    21122203    gc->setValue(false);
    21132204    gc->setHelpText(QObject::tr("If set, when you exit near the end of a "
     
    21152206                    "detection is not foolproof, so do not enable this "
    21162207                    "setting if you don't want an unwatched recording marked "
    21172208                    "as watched."));
    2118     return gc;
     2209    return wrap(gc, settings);
    21192210}
    21202211
    21212212static HostSpinBox *LiveTVIdleTimeout()
     
    23802471    return gc;
    23812472}
    23822473
    2383 static HostComboBox *LetterboxingColour()
     2474static Configurable *LetterboxingColour(PlaySettings *settings)
    23842475{
    2385     HostComboBox *gc = new HostComboBox("LetterboxColour");
     2476    CREATE_COMBOBOX_SETTING(gc, "LetterboxColour", settings);
    23862477    gc->setLabel(QObject::tr("Letterboxing Color"));
    23872478    for (int m = kLetterBoxColour_Black; m < kLetterBoxColour_END; ++m)
    23882479        gc->addSelection(toString((LetterBoxColour)m), QString::number(m));
     
    23922483            "letterboxing, but those with plasma screens may prefer gray "
    23932484            "to minimize burn-in.") + " " +
    23942485        QObject::tr("Currently only works with XVideo video renderer."));
    2395     return gc;
     2486    return wrap(gc, settings);
    23962487}
    23972488
    2398 static HostComboBox *AspectOverride()
     2489static Configurable *AspectOverride(PlaySettings *settings)
    23992490{
    2400     HostComboBox *gc = new HostComboBox("AspectOverride");
     2491    CREATE_COMBOBOX_SETTING(gc, "AspectOverride", settings);
    24012492    gc->setLabel(QObject::tr("Video Aspect Override"));
    24022493    for (int m = kAspect_Off; m < kAspect_END; ++m)
    24032494        gc->addSelection(toString((AspectOverrideMode)m), QString::number(m));
     
    24052496                        "When enabled, these will override the aspect "
    24062497                        "ratio specified by any broadcaster for all "
    24072498                        "video streams."));
    2408     return gc;
     2499    return wrap(gc, settings);
    24092500}
    24102501
    2411 static HostComboBox *AdjustFill()
     2502static Configurable *AdjustFill(PlaySettings *settings)
    24122503{
    2413     HostComboBox *gc = new HostComboBox("AdjustFill");
     2504    CREATE_COMBOBOX_SETTING(gc, "AdjustFill", settings);
    24142505    gc->setLabel(QObject::tr("Zoom"));
    24152506    gc->addSelection(toString(kAdjustFill_AutoDetect_DefaultOff),
    24162507                     QString::number(kAdjustFill_AutoDetect_DefaultOff));
     
    24212512    gc->setHelpText(QObject::tr(
    24222513                        "When enabled, these will apply a predefined "
    24232514                        "zoom to all video playback in MythTV."));
    2424     return gc;
     2515    return wrap(gc, settings);
    24252516}
    24262517
    24272518// Theme settings
     
    36033694    return gs;
    36043695}
    36053696
    3606 static HostCheckBox *RealtimePriority()
     3697static Configurable *RealtimePriority(PlaySettings *settings)
    36073698{
    3608     HostCheckBox *gc = new HostCheckBox("RealtimePriority");
     3699    CREATE_CHECKBOX_SETTING(gc, "RealtimePriority", settings);
    36093700    gc->setLabel(QObject::tr("Enable realtime priority threads"));
    36103701    gc->setHelpText(QObject::tr("When running mythfrontend with root "
    36113702                    "privileges, some threads can be given enhanced priority. "
    36123703                    "Disable this if mythfrontend freezes during video "
    36133704                    "playback."));
    36143705    gc->setValue(true);
    3615     return gc;
     3706    return wrap(gc, settings);
    36163707}
    36173708
    36183709static HostCheckBox *EnableMediaMon()
     
    37683859};
    37693860
    37703861#ifdef USING_OPENGL_VSYNC
    3771 static HostCheckBox *UseOpenGLVSync()
     3862static Configurable *UseOpenGLVSync(PlaySettings *settings)
    37723863{
    3773     HostCheckBox *gc = new HostCheckBox("UseOpenGLVSync");
     3864    CREATE_CHECKBOX_SETTING(gc, "UseOpenGLVSync", settings);
    37743865    gc->setLabel(QObject::tr("Enable OpenGL vertical sync for timing"));
    37753866    gc->setValue(false);
    37763867    gc->setHelpText(QObject::tr(
    37773868                        "If it is supported by your hardware/drivers, "
    37783869                        "MythTV will use OpenGL vertical syncing for "
    37793870                        "video timing, reducing frame jitter."));
    3780     return gc;
     3871    return wrap(gc, settings);
    37813872}
    37823873#endif
    37833874
     
    42594350    addChild(remotecontrol);
    42604351}
    42614352
    4262 PlaybackSettings::PlaybackSettings()
     4353PlaybackSettings::PlaybackSettings(PlaySettings *settings,
     4354                                   ConfigurationWizard *base)
    42634355{
    42644356    uint i = 0, total = 8;
    42654357#if CONFIG_DARWIN
    42664358    total += 2;
    42674359#endif // USING_DARWIN
     4360    if (settings)
     4361        total -= 3;
    42684362
    42694363
    42704364    VerticalConfigurationGroup* general1 =
    42714365        new VerticalConfigurationGroup(false);
    42724366    general1->setLabel(QObject::tr("General Playback") +
    42734367                      QString(" (%1/%2)").arg(++i).arg(total));
     4368    if (settings)
     4369        general1->setLabel(QObject::tr("Playback group settings for ") +
     4370                           settings->mGroupName + " - " +
     4371                           general1->getLabel());
    42744372
    42754373    HorizontalConfigurationGroup *columns =
    42764374        new HorizontalConfigurationGroup(false, false, true, true);
    42774375
    42784376    VerticalConfigurationGroup *column1 =
    42794377        new VerticalConfigurationGroup(false, false, true, true);
    4280     column1->addChild(RealtimePriority());
    4281     column1->addChild(DecodeExtraAudio());
    4282     column1->addChild(UseVideoTimebase());
    4283     column1->addChild(JumpToProgramOSD());
     4378    if (!settings)
     4379        column1->addChild(RealtimePriority(settings));
     4380    column1->addChild(DecodeExtraAudio(settings));
     4381    column1->addChild(UseVideoTimebase(settings));
     4382    column1->addChild(JumpToProgramOSD(settings));
    42844383    columns->addChild(column1);
    42854384
    42864385    VerticalConfigurationGroup *column2 =
    42874386        new VerticalConfigurationGroup(false, false, true, true);
    4288     column2->addChild(ClearSavedPosition());
    4289     column2->addChild(AltClearSavedPosition());
    4290     column2->addChild(AutomaticSetWatched());
    4291     column2->addChild(ContinueEmbeddedTVPlay());
     4387    column2->addChild(ClearSavedPosition(settings));
     4388    column2->addChild(AltClearSavedPosition(settings));
     4389    column2->addChild(AutomaticSetWatched(settings));
     4390    column2->addChild(ContinueEmbeddedTVPlay(settings));
    42924391    columns->addChild(column2);
    42934392
    42944393    general1->addChild(columns);
    4295     general1->addChild(LiveTVIdleTimeout());
    4296     general1->addChild(AlwaysStreamFiles());
     4394    if (!settings)
     4395        general1->addChild(LiveTVIdleTimeout());
     4396    if (!settings)
     4397        general1->addChild(AlwaysStreamFiles());
    42974398#ifdef USING_OPENGL_VSYNC
    4298     general1->addChild(UseOpenGLVSync());
     4399    general1->addChild(UseOpenGLVSync(settings));
    42994400#endif // USING_OPENGL_VSYNC
    43004401#if defined(USING_XV) || defined(USING_OPENGL_VIDEO) || defined(USING_VDPAU)
    4301     general1->addChild(UsePicControls());
     4402    general1->addChild(UsePicControls(settings));
    43024403#endif // USING_XV
    4303     addChild(general1);
     4404    if (base)
     4405        base->addChild(general1);
     4406    else
     4407        addChild(general1);
    43044408
    43054409    VerticalConfigurationGroup* general2 =
    43064410        new VerticalConfigurationGroup(false);
    43074411    general2->setLabel(QObject::tr("General Playback") +
    43084412                      QString(" (%1/%2)").arg(++i).arg(total));
     4413    if (settings)
     4414        general2->setLabel(QObject::tr("Playback group settings for ") +
     4415                           settings->mGroupName + " - " +
     4416                           general2->getLabel());
    43094417
    43104418    HorizontalConfigurationGroup* oscan =
    43114419        new HorizontalConfigurationGroup(false, false, true, true);
     
    43134421        new VerticalConfigurationGroup(false, false, true, true);
    43144422    VerticalConfigurationGroup *ocol2 =
    43154423        new VerticalConfigurationGroup(false, false, true, true);
    4316     ocol1->addChild(VertScanPercentage());
    4317     ocol1->addChild(YScanDisplacement());
    4318     ocol2->addChild(HorizScanPercentage());
    4319     ocol2->addChild(XScanDisplacement());
     4424    ocol1->addChild(VertScanPercentage(settings));
     4425    ocol1->addChild(YScanDisplacement(settings));
     4426    ocol2->addChild(HorizScanPercentage(settings));
     4427    ocol2->addChild(XScanDisplacement(settings));
    43204428    oscan->addChild(ocol1);
    43214429    oscan->addChild(ocol2);
    43224430
    43234431    HorizontalConfigurationGroup* aspect_fill =
    43244432        new HorizontalConfigurationGroup(false, false, true, true);
    4325     aspect_fill->addChild(AspectOverride());
    4326     aspect_fill->addChild(AdjustFill());
     4433    aspect_fill->addChild(AspectOverride(settings));
     4434    aspect_fill->addChild(AdjustFill(settings));
    43274435
    43284436    general2->addChild(oscan);
    43294437    general2->addChild(aspect_fill);
    4330     general2->addChild(LetterboxingColour());
    4331     general2->addChild(PIPLocationComboBox());
    4332     general2->addChild(PlaybackExitPrompt());
    4333     general2->addChild(EndOfRecordingExitPrompt());
    4334     addChild(general2);
     4438    general2->addChild(LetterboxingColour(settings));
     4439    general2->addChild(PIPLocationComboBox(settings));
     4440    general2->addChild(PlaybackExitPrompt(settings));
     4441    general2->addChild(EndOfRecordingExitPrompt(settings));
     4442    if (base)
     4443        base->addChild(general2);
     4444    else
     4445        addChild(general2);
    43354446
    43364447    QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
    4337     addChild(new PlaybackProfileConfigs(tmp));
     4448    if (base)
     4449        base->addChild(new PlaybackProfileConfigs(tmp, settings));
     4450    else
     4451        addChild(new PlaybackProfileConfigs(tmp, settings));
    43384452
     4453    if (!settings)
     4454    {
    43394455    VerticalConfigurationGroup* pbox = new VerticalConfigurationGroup(false);
    43404456    pbox->setLabel(QObject::tr("View Recordings") +
    43414457                   QString(" (%1/%2)").arg(++i).arg(total));
     
    43644480    pbox3->addChild(DisplayGroupTitleSort());
    43654481    pbox3->addChild(new WatchListSettings());
    43664482    addChild(pbox3);
     4483    }
    43674484
    43684485    VerticalConfigurationGroup* seek = new VerticalConfigurationGroup(false);
    43694486    seek->setLabel(QObject::tr("Seeking") +
    43704487                   QString(" (%1/%2)").arg(++i).arg(total));
    4371     seek->addChild(SmartForward());
    4372     seek->addChild(FFRewReposTime());
    4373     seek->addChild(FFRewReverse());
    4374     seek->addChild(ExactSeeking());
    4375     addChild(seek);
     4488    if (settings)
     4489        seek->setLabel(QObject::tr("Playback group settings for ") +
     4490                       settings->mGroupName + " - " +
     4491                       seek->getLabel());
     4492    seek->addChild(SmartForward(settings));
     4493    seek->addChild(FFRewReposTime(settings));
     4494    seek->addChild(FFRewReverse(settings));
     4495    seek->addChild(ExactSeeking(settings));
     4496    if (base)
     4497        base->addChild(seek);
     4498    else
     4499        addChild(seek);
    43764500
    43774501    VerticalConfigurationGroup* comms = new VerticalConfigurationGroup(false);
    43784502    comms->setLabel(QObject::tr("Commercial Skip") +
    43794503                    QString(" (%1/%2)").arg(++i).arg(total));
    4380     comms->addChild(AutoCommercialSkip());
    4381     comms->addChild(CommRewindAmount());
    4382     comms->addChild(CommNotifyAmount());
     4504    if (settings)
     4505        comms->setLabel(QObject::tr("Playback group settings for ") +
     4506                        settings->mGroupName + " - " +
     4507                        comms->getLabel());
     4508    comms->addChild(AutoCommercialSkip(settings));
     4509    comms->addChild(CommRewindAmount(settings));
     4510    comms->addChild(CommNotifyAmount(settings));
     4511    if (!settings) // these are global settings, not host-specific
     4512    {
    43834513    comms->addChild(MaximumCommercialSkip());
    43844514    comms->addChild(MergeShortCommBreaks());
    43854515    comms->addChild(CommSkipAllBlanks());
    4386     addChild(comms);
     4516    }
     4517    if (base)
     4518        base->addChild(comms);
     4519    else
     4520        addChild(comms);
    43874521
    43884522#if CONFIG_DARWIN
    43894523    VerticalConfigurationGroup* mac1 = new VerticalConfigurationGroup(false);
    43904524    mac1->setLabel(QObject::tr("Mac OS X video settings") +
    43914525                   QString(" (%1/%2)").arg(++i).arg(total));
     4526    if (settings)
     4527        mac1->setLabel(QObject::tr("Playback group settings for ") +
     4528                       settings->mGroupName + " - " +
     4529                       mac1->getLabel());
     4530    if (!settings)
     4531    {
    43924532    mac1->addChild(MacGammaCorrect());
    43934533    mac1->addChild(MacScaleUp());
    43944534    mac1->addChild(MacFullSkip());
    4395     addChild(mac1);
     4535    }
     4536    if (base)
     4537        base->addChild(mac1);
     4538    else
     4539        addChild(mac1);
    43964540
    43974541    VerticalConfigurationGroup* mac2 = new VerticalConfigurationGroup(false);
    43984542    mac2->setLabel(QObject::tr("Mac OS X video settings") +
    43994543                   QString(" (%1/%2)").arg(++i).arg(total));
     4544    if (settings)
     4545        mac2->setLabel(QObject::tr("Playback group settings for ") +
     4546                       settings->mGroupName + " - " +
     4547                       mac2->getLabel());
     4548    if (!setings)
     4549    {
    44004550    mac2->addChild(new MacMainSettings());
    44014551    mac2->addChild(new MacFloatSettings());
    44024552
     
    44054555    row->addChild(new MacDockSettings());
    44064556    row->addChild(new MacDesktopSettings());
    44074557    mac2->addChild(row);
     4558    }
    44084559
    4409     addChild(mac2);
     4560    if (base)
     4561        base->addChild(mac2);
     4562    else
     4563        addChild(mac2);
    44104564#endif
    44114565}
    44124566
    4413 OSDSettings::OSDSettings()
     4567OSDSettings::OSDSettings(PlaySettings *settings,
     4568                         ConfigurationWizard *base)
    44144569{
    44154570    VerticalConfigurationGroup* osd = new VerticalConfigurationGroup(false);
    44164571    osd->setLabel(QObject::tr("On-screen display"));
     4572    if (settings)
     4573        osd->setLabel(QObject::tr("Playback group settings for ") +
     4574                      settings->mGroupName + " - " +
     4575                      osd->getLabel());
    44174576
     4577    if (!settings)
    44184578    osd->addChild(new ThemeSelector("OSDTheme"));
    4419     osd->addChild(OSDGeneralTimeout());
    4420     osd->addChild(OSDProgramInfoTimeout());
    4421     osd->addChild(OSDFont());
    4422     osd->addChild(OSDThemeFontSizeType());
    4423     osd->addChild(EnableMHEG());
    4424     osd->addChild(PersistentBrowseMode());
    4425     osd->addChild(BrowseAllTuners());
    4426     addChild(osd);
     4579    osd->addChild(OSDGeneralTimeout(settings));
     4580    osd->addChild(OSDProgramInfoTimeout(settings));
     4581    osd->addChild(OSDFont(settings));
     4582    osd->addChild(OSDThemeFontSizeType(settings));
     4583    osd->addChild(EnableMHEG(settings));
     4584    if (!settings)
     4585    {
     4586    osd->addChild(PersistentBrowseMode(settings));
     4587    osd->addChild(BrowseAllTuners(settings));
     4588    }
     4589    if (base)
     4590        base->addChild(osd);
     4591    else
     4592        addChild(osd);
    44274593
    44284594    VerticalConfigurationGroup *udp = new VerticalConfigurationGroup(false);
    44294595    udp->setLabel(QObject::tr("UDP OSD Notifications"));
    4430     udp->addChild(OSDNotifyTimeout());
    4431     udp->addChild(UDPNotifyPort());
    4432     addChild(udp);
     4596    if (settings)
     4597        udp->setLabel(QObject::tr("Playback group settings for ") +
     4598                      settings->mGroupName + " - " +
     4599                      udp->getLabel());
     4600    udp->addChild(OSDNotifyTimeout(settings));
     4601    udp->addChild(UDPNotifyPort(settings));
     4602    if (base)
     4603        base->addChild(udp);
     4604    else
     4605        addChild(udp);
    44334606
    44344607    VerticalConfigurationGroup *cc = new VerticalConfigurationGroup(false);
    44354608    cc->setLabel(QObject::tr("Analog Closed Captions"));
    4436     cc->addChild(OSDCCFont());
     4609    if (settings)
     4610        cc->setLabel(QObject::tr("Playback group settings for ") +
     4611                     settings->mGroupName + " - " +
     4612                     cc->getLabel());
     4613    cc->addChild(OSDCCFont(settings));
    44374614    //cc->addChild(DecodeVBIFormat());
    4438     cc->addChild(CCBackground());
    4439     cc->addChild(DefaultCCMode());
    4440     cc->addChild(PreferCC708());
    4441     addChild(cc);
     4615    cc->addChild(CCBackground(settings));
     4616    cc->addChild(DefaultCCMode(settings));
     4617    cc->addChild(PreferCC708(settings));
     4618    if (base)
     4619        base->addChild(cc);
     4620    else
     4621        addChild(cc);
    44424622
    4443     addChild(OSDCC708Settings());
    4444     addChild(OSDCC708Fonts());
    4445     addChild(ExternalSubtitleSettings());
     4623    if (base)
     4624    {
     4625        base->addChild(OSDCC708Settings(settings));
     4626        base->addChild(OSDCC708Fonts(settings));
     4627        base->addChild(ExternalSubtitleSettings(settings));
     4628    }
     4629    else
     4630    {
     4631        addChild(OSDCC708Settings(settings));
     4632        addChild(OSDCC708Fonts(settings));
     4633        addChild(ExternalSubtitleSettings(settings));
     4634    }
    44464635
    44474636#if CONFIG_DARWIN
    44484637    // Any Mac OS-specific OSD stuff would go here.
  • 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"
     
    485486        delete statusbox;
    486487}
    487488
     489ConfigurationWizard *createPlaybackSettingsForPlaybackGroup(PlaySettings *settings, ConfigurationWizard *base)
     490{
     491    return new PlaybackSettings(settings, base);
     492}
     493
     494ConfigurationWizard *createOSDSettingsForPlaybackGroup(PlaySettings *settings, ConfigurationWizard *base)
     495{
     496    return new OSDSettings(settings, base);
     497}
     498
    488499void TVMenuCallback(void *data, QString &selection)
    489500{
    490501    (void)data;
     
    577588    }
    578589    else if (sel == "settings playgroup")
    579590    {
    580         PlayGroupEditor editor;
     591        PlayGroupEditor editor(createPlaybackSettingsForPlaybackGroup,
     592                               createOSDSettingsForPlaybackGroup);
    581593        editor.exec();
    582594    }
    583595    else if (sel == "settings general")
  • programs/mythfrontend/globalsettings.h

     
    1010#include "themeinfo.h"
    1111
    1212class QFileInfo;
     13class PlaySettings;
    1314
    1415class ThemeSelector : public HostImageSelect
    1516{
     
    2324class PlaybackSettings : public ConfigurationWizard
    2425{
    2526  public:
    26     PlaybackSettings();
     27    PlaybackSettings(PlaySettings *settings=NULL,
     28                     ConfigurationWizard *base=NULL);
    2729};
    2830
    2931class OSDSettings: virtual public ConfigurationWizard
    3032{
    3133  public:
    32     OSDSettings();
     34    OSDSettings(PlaySettings *settings=NULL,
     35                ConfigurationWizard *base=NULL);
    3336};
    3437
    3538class GeneralSettings : public ConfigurationWizard
     
    140143    Q_OBJECT
    141144
    142145  public:
    143     PlaybackProfileConfigs(const QString &str);
     146    PlaybackProfileConfigs(const QString &str, PlaySettings *settings);
    144147    virtual ~PlaybackProfileConfigs();
    145148
    146149  private:
     
    152155
    153156  private:
    154157    QStringList   profiles;
    155     HostComboBox *grouptrigger;
     158    ComboBoxSetting *grouptrigger;
    156159};
    157160
    158161#endif
  • programs/mythavtest/main.cpp

     
    2222#include "dbcheck.h"
    2323#include "myththemebase.h"
    2424#include "audiopulseutil.h"
     25#include "playsettings.h"
    2526
    2627
    2728static void *run_priv_thread(void *data)
     
    215216        return GENERIC_EXIT_DB_OUTOFDATE;
    216217    }
    217218
    218     TV *tv = new TV();
    219     if (!tv->Init())
    220     {
    221         VERBOSE(VB_IMPORTANT, "Fatal Error: Could not initialize TV class.");
    222         return TV_EXIT_NO_TV;
    223     }
    224 
    225219    ProgramInfo *pginfo = NULL;
    226220
    227221    if (!filename.isEmpty() &&
     
    240234
    241235    }
    242236
     237    PlaySettings settings(pginfo->playgroup);
     238    TV *tv = new TV(&settings);
     239    if (!tv->Init())
     240    {
     241        VERBOSE(VB_IMPORTANT, "Fatal Error: Could not initialize TV class.");
     242        return TV_EXIT_NO_TV;
     243    }
     244
    243245    TV::StartTV(pginfo, false);
    244246
    245247    if (pginfo)