Files
MBN_STOCK_WEBVIEW/docs/LEGACY_PLAYOUT_ANALYSIS.md

5.3 KiB

원본 Tornado 송출 흐름 분석

이 문서는 MBN_STOCK_NMainForm, Scene 35개 및 PageN/Nxt_PageN을 새 송출 어댑터와 대조한 기준선입니다. 원본 파일은 읽기만 했으며 새 저장소로 복사하지 않았습니다.

MainForm 호출 순서

원본 연결은 UI STA에서 KTAPConnect(1, "127.0.0.1", 30001, 0, event)를 호출한 뒤 GetScenePlayer()를 얻습니다. 연결 성공 판정은 재연결 코드와 동일하게 반환값 1입니다.

여기의 30001은 원본 시스템의 당시 값일 뿐 새 Test endpoint의 기본값이나 검증값이 아닙니다. 새 설정은 격리 Test Tornado의 현재 Tools > Option > Control > Network Server > TCP Port를 직접 확인해 사용합니다. 반환값 1도 매뉴얼의 OnHello 또는 Network Monitoring [R]/[S] 확인을 대신하지 않습니다.

원본 장면 PREPARE의 호출 순서는 다음과 같습니다.

  1. LoadScene(Cuts\<file>.t2s, <scene alias>)
  2. IN effect 플래그에 fade effect 7FadeInSec 적용
  3. BeginTransaction()
  4. 장면별 데이터와 오브젝트 변경
  5. scene.QueryVariables()
  6. EndTransaction()
  7. player.Prepare(10, scene)

TAKE IN은 준비된 장면에 Play(10)을 호출하고 m_TakeIn=true로 전환합니다. TAKE OUT은 과거 CutOut(10) 대신 현재 운영 코드와 동일하게 StopAll()을 사용하고 on-air 상태를 해제합니다. NEXT는 m_TakeIn이 참일 때만 실행되므로 IDLE 또는 PREPARED 상태에서 바로 출력을 시작해서는 안 됩니다.

DynamicK3dSession은 매뉴얼의 transaction 제한에 맞춰 오브젝트 변경을 BeginTransaction/EndTransaction[OnChannel] 안에서 끝낸 뒤 QueryVariables를 호출하고 Prepare합니다. SetSceneEffectType의 첫 인수도 layout이 아니라 IN effect 플래그 1로 전달하며, layout 10Prepare/Play/CutOut에만 사용합니다. TornadoPlayoutEngine은 on-air 상태가 없으면 NEXT를 COM 호출 전에 거부합니다.

K3D의 Play/Stop 계열은 완료 이벤트가 별도인 비동기 명령입니다. 현재 callback handler를 아직 포팅하지 않았으므로 이전/on-air Scene을 명령 반환 직후 Unload하지 않고 연결 종료까지 보존합니다. 실제 운영의 장기 세션 정리는 OnScenePlayed/OnCutOut/OnStopAll 성공 콜백 기반으로 구현해야 합니다.

Scene 빌더의 범위

원본 Scene 폴더에는 35개 빌더가 있습니다. 단순 텍스트와 가시성 외에도 색상, 위치, 크기, crop key, path point, 그래프 데이터, 배경 texture/video 등 장면별 K3D 변형을 수행합니다. 이 로직은 데이터 조회와 WinForms 컨트롤에 강하게 결합되어 있어 단순한 Web 제목/설명 문자열로 대체할 수 없습니다.

현재 어댑터의 PlayoutField는 COM 경계를 검증하는 공통 SetValue/SetVisible만 표현합니다. Web bridge는 presentation용 title/detail을 장면 데이터인 것처럼 버리거나 추측하지 않고, PREPARE/NEXT에 검증된 scene code만 보냅니다. 따라서 승인된 5001.t2s/5006.t2s 연결 시험은 파일 load·prepare·play·stop 경로를 검증하지만 원본 시장 데이터가 채워진 방송 화면의 동등성을 증명하지 않습니다.

장면 데이터를 포팅할 때는 scene code별 builder가 Core의 조회 결과를 명시적인 mutation DTO로 변환하고, 허용된 K3D 메서드만 어댑터가 실행하도록 확장해야 합니다. 오브젝트 이름이나 메서드를 Web 입력에서 임의로 전달하는 범용 reflection API는 만들지 않습니다.

PageN과 NEXT

PageNNxt_PageN은 조회 행 수를 5·6·12개 단위로 나눠 최대 20페이지의 m_pcnt를 계산합니다. MainForm.Next_Scene은 5단/6종목/12종목 장면에서 다음 플레이리스트 항목으로 즉시 이동하지 않고 다음 페이지 데이터를 같은 scene에 다시 채웁니다. 경로에 따라 새 scene을 load하거나 GetPlayingScene(10)을 얻어 transaction 후 다시 prepare/play합니다.

현재 Web NEXT는 on-air 상태에서 다음 플레이리스트 cue를 prepare/play하는 어댑터 수준의 동작입니다. m_pcnt, 현재 페이지, 같은 scene의 in-place update 및 GetPlayingScene 기반 갱신은 아직 장면 builder 계층이 없으므로 구현 범위에 포함되지 않습니다. 운영 동등성 검증에서는 이 항목을 별도 완료 조건으로 추적해야 하며, 현재 Test 시퀀스 성공을 PageN 포팅 완료로 해석하지 않습니다.

현재 Test 판정 범위

격리 Test에서 확인할 수 있는 범위는 다음과 같습니다.

  • x64 COM 활성화와 KTAP 연결/해제
  • 승인된 .t2s의 load와 scene alias
  • 오브젝트 transaction 종료 뒤 QueryVariables, layout 10 prepare
  • TAKE IN, 다음 cue의 NEXT, TAKE OUT StopAll
  • STA 직렬화, timeout, 프로세스 교체 및 오류 상태

다음 항목은 별도 장면 마이그레이션 작업이 필요합니다.

  • 35개 scene builder의 데이터/시각 속성 동등성
  • PageN/Nxt_PageN 페이지 계산과 같은 scene 갱신
  • 배경 영상·texture 및 그래프/path mutation
  • 실제 시장 데이터와 원본 화면의 픽셀/내용 비교
  • OnScenePlayed/OnCutOut/OnStopAll callback 기반 Scene unload